GET
H2
|
200
|
Primary Request
/
Show response
www.giga.de/downloads/irfanview/
|
197 KB
64 KB
|
266ms
180ms
|
Document
text/html |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
source-sans-pro-v11-latin-700.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
15 KB
15 KB
|
119ms
29ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
source-sans-pro-v11-latin-600.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
15 KB
16 KB
|
121ms
32ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
source-sans-pro-v11-latin-regular.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
16 KB
16 KB
|
124ms
34ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
lux.js
Show response
cdn.speedcurve.com/js/
|
19 KB
7 KB
|
82ms
23ms
|
Script
application/javascript |
151.101.14.217
FASTLY
|
|
|
GET
H2
|
200
|
pre-352328ff0e.js
Show response
www.giga.de/static-local/dist/assets/js/
|
33 KB
11 KB
|
48ms
46ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
main-desktop-f9225ecdac.css
www.giga.de/static-local/dist/assets/css/
|
548 KB
62 KB
|
45ms
44ms
|
Stylesheet
text/css |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
iam.js
Show response
script.ioam.de/
|
38 KB
11 KB
|
93ms
32ms
|
Script
application/javascript |
91.215.103.64
INFONLINE-AS
|
|
|
GET
H2
|
200
|
metaTag.min.4f65a0e9fe0d6367b27b800ce874e982.js
Show response
js.stroeermediabrands.de/
|
280 KB
63 KB
|
85ms
26ms
|
Script
application/javascript |
46.253.113.178
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
trackcp.js
Show response
gocp.stroeermediabrands.de/
|
28 KB
11 KB
|
113ms
30ms
|
Script
application/javascript |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
marvin-profilbild-rcm40x40.jpg
static.giga.de/wp-content/uploads/2013/05/
|
1 KB
2 KB
|
93ms
33ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
|
106 KB
38 KB
|
21ms
20ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
|
GET
H2
|
200
|
1.gif
www.gstatic.com/psa/static/
|
53 B
144 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:809::2003
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
-
https://ssl-econa.met.vgwort.de/na/14f006f237504649960c529ba2c4929a
-
https://ssl-econa.met.vgwort.de/blank.gif
|
43 B
332 B
|
25ms
25ms
|
Image
image/gif |
161.156.66.178
SOFTLAYER
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
248 B
|
7ms
6ms
|
Image
image/gif |
2a03:2880:f11c:8183:face:b00c:0:25de
FACEBOOK
|
|
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
44 KB
18 KB
|
7ms
6ms
|
Script
text/javascript |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/analytics.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-352328ff0e.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
apstag.js
Show response
c.amazon-adsystem.com/aax2/
|
87 KB
25 KB
|
104ms
44ms
|
Script
application/javascript |
143.204.201.153
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
api
Show response
tracking.m6r.eu/sync/
Redirect Chain
-
https://cdn.m6r.eu/sync/api
-
https://tracking.m6r.eu/sync/api?checkcookies=true
|
1 KB
1 KB
|
67ms
66ms
|
Script
application/javascript |
92.122.247.161
AKAMAI-AS
|
|
|
GET
H2
|
200
|
init
Show response
d.nativendo.de/cds/delivery/
|
1 KB
1 KB
|
64ms
30ms
|
Script
text/javascript |
107.178.241.34
GOOGLE
|
|
|
GET
H2
|
200
|
identitystatus
Show response
irqs.ioam.de/
|
25 B
203 B
|
95ms
32ms
|
XHR
application/vnd.api+json |
193.46.63.75
INFONLINE-AS
|
|
General
- Full URL
- https://irqs.ioam.de/identitystatus?offerIdentifier=giga&siteIdentifier=software_content&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.4873164822808562
- Requested by
- Host: script.ioam.de
URL: https://script.ioam.de/iam.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
193.46.63.75
Alfter, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- irqs.ioam.de
- Software
-
nginx /
- Resource Hash
- 9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H/1.1
|
200
OK
|
blank.gif
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=0009&i2=0009f71bbf3ffcb945e4ed3fe&ep=1609585573...
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=0009&i2=0009f71bbf3ffcb945e4ed3fe&ep=1609585573...
-
https://de.ioam.de/blank.gif
|
43 B
651 B
|
22ms
22ms
|
Image
image/gif |
91.215.103.65
INFONLINE-AS
|
|
|
GET
H2
|
200
|
lazyload-65c07b80e0.min.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/lazyload/
|
5 KB
2 KB
|
29ms
29ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
|
10 KB
10 KB
|
29ms
29ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
172493
Show response
videos.giga.de/embed/
Frame E031
|
9 KB
3 KB
|
104ms
42ms
|
Document
text/html |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
172495
Show response
videos.giga.de/embed/
Frame 3227
|
9 KB
3 KB
|
103ms
43ms
|
Document
text/html |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
giga-c332db69e7.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
37 KB
13 KB
|
29ms
29ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
bg-teaser.png
www.giga.de/wp-content/themes/project/assets/img/teaser/
|
647 B
865 B
|
29ms
29ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/r/
|
35 B
111 B
|
14ms
13ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/r/collect?v=1&_v=j81&aip=1&a=139742495&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=4GBAAEAB~&jid=471725603&gjid=1194451110&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&_r=1&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&z=1871123659
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.0
|
200
OK
|
z.js
Show response
go.giga-abs.de/
|
1 KB
1 KB
|
132ms
29ms
|
Script
text/javascript |
178.19.72.20
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
iframe
tracking.m6r.eu/pixel/
Frame 7CD8
Redirect Chain
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
|
0
0
|
72ms
71ms
|
Document
text/html |
92.122.247.161
AKAMAI-AS
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
92.122.247.161
, France,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a92-122-247-161.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
tfa.js
Show response
cdn.taboola.com/libtrc/unip/1092206/
|
61 KB
21 KB
|
70ms
22ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
|
43 KB
15 KB
|
93ms
41ms
|
Script
text/javascript |
216.58.207.66
GOOGLE
|
|
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
289 KB
89 KB
|
124ms
48ms
|
Script
application/javascript |
143.204.202.10
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
126 KB
49 KB
|
104ms
44ms
|
Script
text/javascript |
23.36.232.106
AKAMAI-AS
|
|
|
GET
H/1.1
|
302
Moved Temporarily
|
dmp
Show response
tracking.m6r.eu/sync/
Redirect Chain
-
https://tracking.m6r.eu/sync/dmp
-
https://tracking.m6r.eu/sync/dmp?checkcookies=true
|
0
-1 B
|
149ms
76ms
|
XHR
text/plain |
92.122.247.161
AKAMAI-AS
|
|
|
GET
H2
|
200
|
nuggad
Show response
nugmw.userreport.com/rc-ap/2dd2d6ca-6e9e-49f2-90f8-026c8328ffbf/si.nuggad.net/
Redirect Chain
-
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
-
https://nugmw.userreport.com/rc-ap/2dd2d6ca-6e9e-49f2-90f8-026c8328ffbf/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
|
2 KB
2 KB
|
49ms
30ms
|
Script
text/javascript |
2600:9000:214f:7200:1f:a1b:34c0:93a1
AMAZON-02
|
|
|
GET
H2
|
200
|
SDG_CookieLayer.min.js
Show response
cdn.stroeerdigitalgroup.de/metatag/libraries/
|
15 KB
3 KB
|
156ms
5ms
|
Script
application/javascript |
2a02:26f0:6c00:280::5f76
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
110 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=3380307&_u=6GBAAEAB~&jid=&gjid=&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cd21=manuell&cm17=1&cd18=3380307&z=477867715
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
ad-loading.png
www.dunkirkinception.com/detect/
|
179 B
490 B
|
119ms
25ms
|
Image
image/png |
18.194.129.32
AMAZON-02
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
171 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:817::2002
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
171 B
|
16ms
15ms
|
Script
application/javascript |
2a00:1450:4001:817::2002
GOOGLE
|
|
|
GET
H2
|
200
|
show_ads_impl_fy2019.js
Show response
pagead2.googlesyndication.com/pagead/js/r20200219/r20190131/
|
221 KB
83 KB
|
27ms
27ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20200219/r20190131/show_ads_impl_fy2019.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:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0f1fe6829fb73f0beec9dcea8df0429a5a4b631884025d0c73b090d99d4d766b
- 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/r20200219/r20190131/
Frame 836E
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:820::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20200219/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:820::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
user.module.js
Show response
www.giga.de/wp-content/plugins/core/basic/user/feature/static/js/
|
8 KB
2 KB
|
36ms
36ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
post-33dedcb970.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
7 KB
3 KB
|
37ms
37ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
smb-phone-plan-ef34ebe4f8.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/
|
53 KB
18 KB
|
37ms
37ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
loader.js
Show response
c.nativendo.de/cdn/asset/js/
|
56 KB
18 KB
|
47ms
15ms
|
Script
application/javascript |
2606:4700:20::681a:5fb
CLOUDFLARENET
|
|
|
GET
H/1.1
|
200
OK
|
dkuim.js
Show response
dkuim.de/api/js/2/
|
465 KB
151 KB
|
164ms
63ms
|
Script
application/javascript |
178.19.65.130
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
image-gallery-ba2fa45248.js
Show response
www.giga.de/static-local/dist/assets/js/components/
|
1 KB
996 B
|
29ms
29ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
user-rating.module.js
Show response
www.giga.de/wp-content/plugins/core/features/user-rating/feature/static/js/
|
18 KB
4 KB
|
29ms
29ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
107 B
492 B
|
234ms
233ms
|
XHR
text/javascript |
143.204.201.153
AMAZON-02
|
|
General
- Full URL
- https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&pid=CjewOZDhQB0iS&cb=0&ws=1600x1200&v=7.47.00&t=1000&slots=%5B%7B%22sd%22%3A%220%22%2C%22s%22%3A%5B%22728x90%22%2C%22800x250%22%2C%22970x250%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%221%22%2C%22s%22%3A%5B%22160x600%22%2C%22300x600%22%5D%2C%22sn%22%3A%22sky%22%7D%2C%7B%22sd%22%3A%222%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%7D%5D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.201.153
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-143-204-201-153.fra53.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- 9694d72e65a5b488a1e18d166970ab73de4848e18766fee7634d803cef4cc8f7
|
GET
H2
|
200
|
aps_csm.js
Show response
c.amazon-adsystem.com/bao-csm/aps-comm/
|
6 KB
3 KB
|
103ms
28ms
|
XHR
application/javascript |
143.204.201.153
AMAZON-02
|
|
|
GET
H2
|
200
|
videojs-c972511a.min.js
Show response
videos.giga.de/dist/js/embed/bundle/
Frame E031
|
619 KB
206 KB
|
37ms
36ms
|
Script
application/javascript |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
Frame E031
|
268 KB
91 KB
|
70ms
49ms
|
Script
text/javascript |
2a00:1450:4001:81c::200a
GOOGLE
|
|
|
GET
H2
|
200
|
videojs-c972511a.min.js
Show response
videos.giga.de/dist/js/embed/bundle/
Frame 3227
|
619 KB
206 KB
|
91ms
89ms
|
Script
application/javascript |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
Frame 3227
|
268 KB
91 KB
|
70ms
49ms
|
Script
text/javascript |
2a00:1450:4001:81c::200a
GOOGLE
|
|
|
GET
H2
|
200
|
jquery.min.js
Show response
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
|
85 KB
30 KB
|
11ms
7ms
|
Script
text/javascript |
2a00:1450:4001:817::200a
GOOGLE
|
|
|
GET
H2
|
200
|
videojs-f50f7a8d.css
videos.giga.de/dist/css/
Frame E031
|
53 KB
15 KB
|
97ms
96ms
|
Stylesheet
text/css |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
play_button.svg
videos.giga.de/image/
Frame E031
|
1015 B
1 KB
|
97ms
97ms
|
Image
image/svg+xml |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
videojs-f50f7a8d.css
videos.giga.de/dist/css/
Frame 3227
|
53 KB
15 KB
|
96ms
96ms
|
Stylesheet
text/css |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
play_button.svg
videos.giga.de/image/
Frame 3227
|
1015 B
1 KB
|
97ms
96ms
|
Image
image/svg+xml |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
md5-8984469f61.js
Show response
www.giga.de/static-local/dist/assets/js/helper/
|
3 KB
2 KB
|
36ms
34ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
32ms
30ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/o.gif?__ir=&__is=1600_1200_24&__iu=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&__id=1582224383000&__it=-60&__ic=727391&__iq=ce622a7cc3514b522a3d6b39652425fb&__ig=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- HTTP/1.0
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.20
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
X/1.0 /
- Resource Hash
- 2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
|
GET
H2
|
200
|
loader.js
Show response
cdn.taboola.com/libtrc/stroeer-smb-giga/
|
119 KB
22 KB
|
25ms
23ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 76F0
|
0
0
|
269ms
266ms
|
Document
text/html |
2a00:1450:4001:820::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=250&slotname=9921598555&adk=2154913067&adf=2485742297&w=300&lmt=1582224383&psa=0&guci=1.2.0.0.2.2.0.0&format=300x250&url=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&flash=0&wgl=1&adsid=NT&dt=1582224382932&bpp=16&bdt=372&fdt=87&idt=87&shv=r20200219&cbv=r20190131&ptt=9&saldr=aa&abxe=1&correlator=5725820942077&frm=20&pv=2&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&ga_fc=0&iag=0&icsg=52843133006798&dssz=67&mdo=0&mso=0&u_tz=60&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=318&ady=561&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065304%2C44714237&oid=3&pvsid=1056494168406379&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CleE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=7uMG0xRID4&p=https%3A//www.giga.de&dtd=102
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200219/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, 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/
|
73 KB
27 KB
|
15ms
14ms
|
Script
text/javascript |
2a00:1450:4001:817::2002
GOOGLE
|
|
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/r20200219/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:817::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 753def12fae8722bef366a340b5ab7c34a15c8cd8432cdddb30d8f91ab987b96
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
photoswipe-ui-default-06489ae894.min.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/photoswipe/
|
10 KB
4 KB
|
30ms
30ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
dmp
Show response
tracking.m6r.eu/sync/
|
86 B
612 B
|
74ms
74ms
|
XHR
application/json |
92.122.247.161
AKAMAI-AS
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 84EA
|
0
0
|
19ms
17ms
|
Document
text/html |
2a00:1450:4001:820::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1582224383&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C17%3A32%2C24%3A32%2C25%3A32%2C30%3A1081344%2C32%3A32%2C40%3A32&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1582224382948&bpp=3&bdt=389&fdt=130&idt=130&shv=r20200219&cbv=r20190131&ptt=9&saldr=aa&abxe=1&prev_fmts=300x250&nras=1&correlator=5725820942077&frm=20&pv=1&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&ga_fc=0&iag=0&icsg=211372532027198&dssz=69&mdo=0&mso=0&u_tz=60&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=21065304%2C44714237&oid=3&pvsid=1056494168406379&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=1&uci=a!1&fsb=1&dtd=136
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200219/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
bootstrap.min.js
Show response
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
|
36 KB
10 KB
|
19ms
18ms
|
Script
text/javascript |
209.197.3.15
HIGHWINDS3
|
|
|
GET
H2
|
200
|
pubads_impl_2020013001.js
Show response
securepubads.g.doubleclick.net/gpt/
|
167 KB
61 KB
|
50ms
50ms
|
Script
text/javascript |
216.58.207.66
GOOGLE
|
|
|
GET
H2
|
200
|
photoswipe-9c448861a8.min.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/photoswipe/
|
31 KB
12 KB
|
30ms
29ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ForumViewTopicContentAD.Cj3s-YOGFGen4.png
www.giga.de/special/gutscheine/
|
71 B
273 B
|
43ms
42ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
impl.20200218-15-RELEASE.js
Show response
cdn.taboola.com/libtrc/
|
441 KB
125 KB
|
22ms
22ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H/1.1
|
200
OK
|
beacon.js
Show response
sb.scorecardresearch.com/
|
1 KB
1 KB
|
105ms
30ms
|
Script
application/x-javascript |
104.85.250.71
AKAMAI-AS
|
|
|
POST
H2
|
204
|
session
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
89ms
29ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
submit
lb75.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
115ms
28ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb75.s400.meetrics.net/bb-mx/submit?/bJUDBRAAA+whFoo0F0wFz6BvvA33F3uBnpFnhFukElvBkvF3uFsvFhkFzvBpyFmhFu2FplF3vBfpyF+k2FoywAx5AtxAxtAy1AtxAx6Aw4At2A35A2wAwtAyuAxxA1uAytAkzB0zAlkFimFL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BEOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSbgCPAAAAAAAAAOAAAAGBAAAAAAZwSbgCBRksFAQtjFJOAzSA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb75.s400.meetrics.net/
|
43 B
308 B
|
113ms
26ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
|
GET
H2
|
200
|
nuggad
ih.adscale.de/
|
49 B
283 B
|
23ms
22ms
|
Image
image/gif |
3.124.22.230
AMAZON-02
|
|
|
GET
H2
|
200
|
nativendo.css
c.nativendo.de/cdn/asset/css/
|
5 KB
1 KB
|
17ms
16ms
|
Stylesheet
text/css |
2606:4700:20::681a:5fb
CLOUDFLARENET
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
110 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=172495%20--%20winload-irfanview-plugins-video-hd.mp4%5Bvideojs%2F7.6.6%5D%5BUser%20Click2Play%5D&_u=6GBAAEAB~&jid=&gjid=&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cd9=201406&cd11=172495&cd12=PRESS&cd13=93&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.6&cd44=0&cm1=1&z=1811885569
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
Cookie set
iu3
aax-eu.amazon-adsystem.com/s/
Frame F964
Redirect Chain
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&dcc=t
|
0
0
|
202ms
201ms
|
Document
text/html |
52.94.216.48
AMAZON-02
|
|
General
- Full URL
- https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&dcc=t
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.94.216.48
Dublin, Ireland,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
Server /
- Resource Hash
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
103 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=172493%20--%20winload-irfanview-video-hd.mp4%5Bvideojs%2F7.6.6%5D%5BSite%20Autoplay%5D&_u=6GBAAEAB~&jid=&gjid=&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cd9=201406&cd11=172493&cd12=PRESS&cd13=189&cd14=true&cd19=Site%20Autoplay&cd38=videojs%2F7.6.6&cd44=0&cm1=1&z=1058641089
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
13 KB
5 KB
|
484ms
483ms
|
XHR
text/plain |
216.58.207.66
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1056494168406379&correlator=2111328225440517&output=ldjh&impl=fif&adsid=NT&eid=21062414%2C21063636%2C21065432%2C21065304&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200220&iu=4444%2Fgiga.de_sd%2Fsoftware_produktseite&sz=800x450%7C580x500%7C580x360%7C480x360%7C42x31&scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DSoftware-File%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D2%26smb-hour%3D19%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26nuggad%3Dn127-0%252Cn121-2%252Cn42-1%252Cn116-0%252Cn24-1%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn2-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-1%252Cn160-0%252Cn107-0%252Cn21-1%252Cn51-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-1%252Cn36-1%252Cn119-2%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-1%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-0%252Cn26-1%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-0%252Cn6-1%252Cn63-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-2%252Cn90-0%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-4%252Cn3-1%252Cn82-1%252Cn59-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-2%252Cn67-2%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%252Cn144-1%252Cn132-4%252Cn133-1%26mbrid%3D86421fabd0db152b1e74d1a98349514f%26mbrseg%3Dff6482ed%252Cb3838f1f%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582224383&dt=1582224383347&dlt=1582224382559&idt=771&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3608214049&uci=1&ifi=2&u_tz=60&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.giga.de%2Fdownloads%2Firfanview%2F&dssz=75&icsg=68172670516402&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=596x0&msz=800x450&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- b86419a02bd57b326f54607a5d3e298a99a9d6dd93cf0d3b0231f45c04c4c2da
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020013001.js
Show response
securepubads.g.doubleclick.net/gpt/
|
66 KB
24 KB
|
34ms
33ms
|
Script
text/javascript |
216.58.207.66
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
|
0
0
|
6ms
5ms
|
Other
text/html |
2a00:1450:4001:81a::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
3 KB
2 KB
|
474ms
473ms
|
XHR
text/plain |
216.58.207.66
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1056494168406379&correlator=2111328225440517&output=ldjh&impl=fif&adsid=NT&eid=21062414%2C21063636%2C21065432%2C21065304&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200220&iu=4444%2Fgiga.de_sd%2Fsoftware_produktseite&sz=1x1&ists=1&scp=as%3Dout_of_page%26adslot%3Dout_of_page%26pc%3D1%26af%3Dtickerad&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DSoftware-File%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D2%26smb-hour%3D19%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26nuggad%3Dn127-0%252Cn121-2%252Cn42-1%252Cn116-0%252Cn24-1%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn2-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-1%252Cn160-0%252Cn107-0%252Cn21-1%252Cn51-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-1%252Cn36-1%252Cn119-2%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-1%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-0%252Cn26-1%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-0%252Cn6-1%252Cn63-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-2%252Cn90-0%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-4%252Cn3-1%252Cn82-1%252Cn59-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-2%252Cn67-2%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%252Cn144-1%252Cn132-4%252Cn133-1%26mbrid%3D86421fabd0db152b1e74d1a98349514f%26mbrseg%3Dff6482ed%252Cb3838f1f%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582224383&dt=1582224383357&dlt=1582224382559&idt=771&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2830864137&uci=2&ifi=3&u_tz=60&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.giga.de%2Fdownloads%2Firfanview%2F&dssz=76&icsg=68172670516402&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1585x0&msz=1x1&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- d909950e23c968f5a3e2d18d4c80b65f2b089157b3fe78141de8659c539d909b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
json
Show response
trc.taboola.com/stroeer-smb-giga/trc/3/
|
13 KB
6 KB
|
332ms
332ms
|
Script
application/javascript |
151.101.14.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=19%3A46%3A23.475<i=deflated&data=%7B%22id%22%3A601%2C%22ii%22%3A%22%2Fdownloads%2Firfanview%22%2C%22it%22%3A%22category%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1582224382986%2C%22cv%22%3A%2220200218-15-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%2C%22cmps%22%3A3%2C%22btv%22%3A%220%22%2C%22cos%22%3A%224g%22%2C%22bad%22%3A-1%2C%22sw%22%3A1600%2C%22sh%22%3A1200%2C%22bw%22%3A1600%2C%22sde%22%3A%221.000%22%2C%22bh%22%3A1200%2C%22dw%22%3A1585%2C%22dh%22%3A10267%2C%22r%22%3A%5B%7B%22li%22%3A%22rbox-c2m%22%2C%22s%22%3A9%2C%22uim%22%3A%22alternating-thumbnails-a%3Aabp%3D0%22%2C%22uip%22%3A%22Below%20Download%20Thumbnails%20-%20Video%22%2C%22orig_uip%22%3A%22Below%20Download%20Thumbnails%20-%20Video%22%2C%22cd%22%3A5393.875%2C%22mw%22%3A625%7D%5D%2C%22cb%22%3A%22TRC.callbacks.recommendations_1%22%2C%22lt%22%3A%22deflated%22%7D
- Requested by
- Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20200218-15-RELEASE.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- c7c7935d9d94246d3e76bcda7e6d38a2166b8e66745839a78cb625fda8d933e3
|
POST
H2
|
204
|
bid
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
29ms
29ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
7 KB
3 KB
|
603ms
602ms
|
XHR
text/plain |
216.58.207.66
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1056494168406379&correlator=2111328225440517&output=ldjh&impl=fif&adsid=NT&eid=21062414%2C21063636%2C21065432%2C21065304&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200220&iu=4444%2Fgiga.de_sd%2Fsoftware_produktseite&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C468x60%7C728x90%7C728x180%7C1000x150%7C31x31&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A20918.scenario%253Adefault%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cfullb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2Cvto&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DSoftware-File%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D2%26smb-hour%3D19%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26nuggad%3Dn127-0%252Cn121-2%252Cn42-1%252Cn116-0%252Cn24-1%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn2-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-1%252Cn160-0%252Cn107-0%252Cn21-1%252Cn51-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-1%252Cn36-1%252Cn119-2%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-1%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-0%252Cn26-1%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-0%252Cn6-1%252Cn63-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-2%252Cn90-0%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-4%252Cn3-1%252Cn82-1%252Cn59-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-2%252Cn67-2%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%252Cn144-1%252Cn132-4%252Cn133-1%26mbrid%3D86421fabd0db152b1e74d1a98349514f%26mbrseg%3Dff6482ed%252Cb3838f1f%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582224383&dt=1582224383497&dlt=1582224382559&idt=771&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1008420861&uci=3&ifi=4&u_tz=60&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.giga.de%2Fdownloads%2Firfanview%2F&dssz=77&icsg=68172670516402&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- b893f28293429077c17d50c1ad8bba0a52e1ece5786e049e6974219e95d4c3b5
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
14 KB
8 KB
|
915ms
915ms
|
XHR
text/plain |
216.58.207.66
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1056494168406379&correlator=2111328225440517&output=ldjh&impl=fif&adsid=NT&eid=21062414%2C21063636%2C21065432%2C21065304&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200220&iu=4444%2Fgiga.de_sd%2Fsoftware_produktseite&sz=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&scp=as%3Dsky%26adslot%3Dsky%26af%3Dfirepl%2Cwp%2Cvidwa%2Cf1x4%2Cf1x3%2Cf1x2%2Cds%2Cdds%2Csky%2Chpad%2Cband%26rfree%3D200-299%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A19051.scenario%253Adefault%26yieldlove_meta%3Dpid%253A19051.sb%253Af%26yieldlove_pid%3D19051%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DSoftware-File%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D2%26smb-hour%3D19%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26nuggad%3Dn127-0%252Cn121-2%252Cn42-1%252Cn116-0%252Cn24-1%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn2-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-1%252Cn160-0%252Cn107-0%252Cn21-1%252Cn51-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-1%252Cn36-1%252Cn119-2%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-1%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-0%252Cn26-1%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-0%252Cn6-1%252Cn63-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-2%252Cn90-0%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-4%252Cn3-1%252Cn82-1%252Cn59-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-2%252Cn67-2%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%252Cn144-1%252Cn132-4%252Cn133-1%26mbrid%3D86421fabd0db152b1e74d1a98349514f%26mbrseg%3Dff6482ed%252Cb3838f1f%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582224383&dt=1582224383502&dlt=1582224382559&idt=771&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2889272997&uci=4&ifi=5&u_tz=60&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.giga.de%2Fdownloads%2Firfanview%2F&dssz=77&icsg=68172670516402&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- ccc542b9e603f4053ef6ebb98e7bd00d952839a21650d82d93b5c669716f3778
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
17 KB
9 KB
|
1244ms
1244ms
|
XHR
text/plain |
216.58.207.66
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1056494168406379&correlator=2111328225440517&output=ldjh&impl=fif&adsid=NT&eid=21062414%2C21063636%2C21065432%2C21065304&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200220&iu=4444%2Fgiga.de_sd%2Fsoftware_produktseite&sz=10x20%7C10x10%7C300x250%7C34x31&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A9501.scenario%253Adefault%26yieldlove_meta%3Dpid%253A9501.sb%253Af%26yieldlove_pid%3D9501%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DSoftware-File%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D2%26smb-hour%3D19%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26nuggad%3Dn127-0%252Cn121-2%252Cn42-1%252Cn116-0%252Cn24-1%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn2-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-1%252Cn160-0%252Cn107-0%252Cn21-1%252Cn51-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-1%252Cn36-1%252Cn119-2%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-1%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-0%252Cn26-1%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-0%252Cn6-1%252Cn63-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-2%252Cn90-0%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-4%252Cn3-1%252Cn82-1%252Cn59-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-2%252Cn67-2%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%252Cn144-1%252Cn132-4%252Cn133-1%26mbrid%3D86421fabd0db152b1e74d1a98349514f%26mbrseg%3Dff6482ed%252Cb3838f1f%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582224383&dt=1582224383506&dlt=1582224382559&idt=771&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=625271203&uci=5&ifi=6&u_tz=60&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.giga.de%2Fdownloads%2Firfanview%2F&dssz=77&icsg=68172670516402&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 27b10092a55d2f9c6e69c6658af3b821a3abfe8c39560e98ac3680decad04a1d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
POST
H2
|
204
|
auction
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
30ms
30ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
GET
H/1.1
|
204
No Content
|
b2
sb.scorecardresearch.com/
Redirect Chain
-
https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1582224383512&ns_c=UTF-8&cv=3.5&c8=IrfanView%20Download&c7=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&c9=
-
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1582224383512&ns_c=UTF-8&cv=3.5&c8=IrfanView%20Download&c7=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&c9=
|
0
248 B
|
30ms
30ms
|
Image
text/plain |
104.85.250.71
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
config.js
Show response
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
|
36 KB
9 KB
|
78ms
24ms
|
Script
text/javascript |
151.101.13.194
FASTLY
|
|
|
GET
H2
|
200
|
/
Show response
d.nativendo.de/cds/delivery/get/
|
2 KB
1 KB
|
43ms
43ms
|
Script
text/javascript |
107.178.241.34
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/202002111741/
|
37 KB
14 KB
|
24ms
24ms
|
Script
application/javascript |
151.101.13.194
FASTLY
|
|
General
- Full URL
- https://confiant-integrations.global.ssl.fastly.net/prebid/202002111741/wrap.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.13.194
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 54a5f6b6e229bcae1a84f6c08614287d0770c96b7d2cfeffe9da6c6c90df2364
|
GET
H2
|
200
|
userx.20200218-15-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
22 KB
8 KB
|
22ms
21ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
204
|
rtb-h
trc.taboola.com/sg/exposebox-network/1/
Frame B997
Redirect Chain
-
https://server.exposebox.com/rcm
-
https://trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_isttm14
|
0
54 B
|
32ms
32ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
200
|
match
match.zorosrv.com/
Frame B997
Redirect Chain
-
https://rtb.mfadsrvr.com/sync?ssp=taboola
-
https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
-
https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=3039d8fe-e21d-4ec6-b1b5-b3c333d5a398
-
https://match.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=3039d8fe-e21d-4ec6-b1b5-b3c333d5a398&tbid=a27582e6-5d4a-4a15-8322-e2458621be0d-tuct548597f&query=taboola_hm%3D3039d8fe-e21d-...
-
https://match.zorosrv.com/match?tabid=a27582e6-5d4a-4a15-8322-e2458621be0d-tuct548597f&extuid=3039d8fe-e21d-4ec6-b1b5-b3c333d5a398&excid=218&query=taboola_hm%3D3039d8fe-e21d-4ec6-b1b5-b3c333d5a398
|
0
293 B
|
33ms
31ms
|
Image
text/plain |
151.101.14.49
FASTLY
|
|
General
- Full URL
- https://match.zorosrv.com/match?tabid=a27582e6-5d4a-4a15-8322-e2458621be0d-tuct548597f&extuid=3039d8fe-e21d-4ec6-b1b5-b3c333d5a398&excid=218&query=taboola_hm%3D3039d8fe-e21d-4ec6-b1b5-b3c333d5a398
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
204
No Content
|
sync.php
pixel.rubiconproject.com/exchange/
Frame B997
|
0
239 B
|
115ms
38ms
|
Image
image/gif |
69.173.144.139
RUBICONPROJECT
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/
Frame B997
Redirect Chain
-
https://px.powerlinks.com/user/identify?sourceId=d4a7a706-ab0f-11e8-a038-127202fb7690&rurl=https%3A%2F%2Ftrc.taboola.com%2Fsg%2Fpowerlinksdsp-network%2F1%2Frtb-h%2F%3Ftaboola_hm%3D%24%7BUSER%7D
-
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=N014F5_mY-JBihXLyWhUljabGIEPkgrP_TmaC93_kjc%3D
|
45 B
108 B
|
33ms
33ms
|
Image
image/gif |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/
Frame B997
Redirect Chain
-
https://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID]
-
https://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID]&mm_bnc&mm_bct&UUID=15265e4e-d3ff-4d00-82ae-a3b192fed12a
-
https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=15265e4e-d3ff-4d00-82ae-a3b192fed12a
|
0
59 B
|
47ms
46ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
204
|
/
trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/
Frame B997
Redirect Chain
-
https://bh.contextweb.com/bh/rtset?pid=562107&ev=1&rurl=https%3A%2F%2Ftrc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=%%VGUID%%
-
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=TasGYLF52Y6u&ev=1&pid=562107
|
0
112 B
|
34ms
34ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
204
|
/
trc.taboola.com/sg/rtbhouse-network/1/rtb-h/
Frame B997
Redirect Chain
-
https://creativecdn.com/cm-notify?pi=taboola
-
https://ams.creativecdn.com/cm-notify?pi=taboola&tc=1
-
https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=A2RPvMNPzKkOr3BKERih&pi=taboola&tc=1
|
0
51 B
|
32ms
31ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
|
GET
H/1.1
|
200
OK
|
getuidnb
ib.adnxs.com/
Frame B997
|
43 B
690 B
|
18ms
16ms
|
Image
image/gif |
185.33.223.203
ASN-APPNEX
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/google-network/1/rtb-h/
Frame B997
Redirect Chain
-
https://cm.g.doubleclick.net/pixel?google_nid=taboola_dbm&google_cm&google_sc
-
https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEGnKKKJq17pYqyipNDARnAk&google_cver=1
|
0
70 B
|
36ms
35ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
|
GET
H/1.1
|
200
OK
|
getuidnb
ib.adnxs.com/
Frame B997
|
43 B
691 B
|
17ms
17ms
|
Image
image/gif |
185.33.223.203
ASN-APPNEX
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/thetradedesk-network/1/rtb-h/
Frame B997
Redirect Chain
-
https://match.adsrvr.org/track/cmf/generic?ttd_pid=054f32o&ttd_tpi=1
-
https://match.adsrvr.org/track/cmb/generic?ttd_pid=054f32o&ttd_tpi=1
-
https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=cb6ec19e-32c5-4819-a61d-d2b1b34ca6ad
|
0
201 B
|
33ms
33ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
200
|
rtb-h
trc.taboola.com/sg/storygize-network/1/
Frame B997
Redirect Chain
-
https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=a27582e6-5d4a-4a15-8322-e2458621be0d-tuct548597f
-
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
|
0
55 B
|
44ms
43ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
|
GET
H/1.1
|
200
OK
|
cookiesync
bttrack.com/pixel/
Frame B997
|
35 B
380 B
|
3496ms
111ms
|
Image
image/gif |
192.132.33.46
BIDTELLECT
|
|
|
GET
H/1.1
|
204
No Content
|
/
cds.taboola.com/
Frame B997
|
0
176 B
|
5373ms
110ms
|
Image
text/plain |
141.226.224.32
TABOOLA-AS
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/bidswitch-network/1/rtb-h/
Frame B997
Redirect Chain
-
https://x.bidswitch.net/sync?ssp=taboola
-
https://x.bidswitch.net/ul_cb/sync?ssp=taboola
-
https://ads.betweendigital.com/match?bidder_id=43092&callback_url=https%3A%2F%2Fx.bidswitch.net%2Fsync%3Fdsp_id%3D429%26user_id%3D%24%7BUSER_ID%7D%26ssp%3Dtaboola%26expires%3D30
-
https://ads.betweendigital.com/match?bidder_id=43092&callback_url=https%3A%2F%2Fx.bidswitch.net%2Fsync%3Fdsp_id%3D429%26user_id%3D%24%7BUSER_ID%7D%26ssp%3Dtaboola%26expires%3D30&crf=1
-
https://x.bidswitch.net/sync?dsp_id=429&user_id=238f4027-9e91-3820-9c54-f0af531656b1&ssp=taboola&expires=30
-
https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=7cf90a98-1a4f-412a-bcd7-27661d6d41b2
|
0
201 B
|
35ms
35ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
103 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Download%20Thumbnails%20-%20Video&_u=6GBAAEAB~&jid=&gjid=&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cm12=1&cm14=1&z=2102851306
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
182de4c2-ebef-4d48-bcdb-1072c47e1a6a.png
cdn.taboola.com/static/18/
|
161 B
421 B
|
23ms
23ms
|
Image
image/png |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/
Frame EA5A
Redirect Chain
-
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvn8xcJcmUuLnnbFq6nGTaoYQGWO9xYossu092-CX713GM6y698_VD5CUY2bSwh48Uu5BTr3--BoiMjY18oArZxxQyWVIcJGccTLK13zNJK7hRTdd2PrEOvHXIFAFQEyl7FTg_CEgddz...
-
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
|
49 B
343 B
|
9ms
6ms
|
Image
image/gif |
2a02:26f0:6c00:280::5f76
AKAMAI-ASN1
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
101 B
|
34ms
33ms
|
XHR
image/gif |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame BBED
|
0
0
|
41ms
41ms
|
Fetch
image/gif |
216.58.207.66
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstYIe5PMP5jXMNZ-E6kBuRWKP_urPz0P-VwFTBbj_P68GubIa-rA8t-fVA0aF-vkz29SpASlAM4swGeSo4Are0FM1THTd25Mde0BFTtdDwYDQmkle2KHTc0SRkxVijqc0zDlhwoU6d3JlTNTvz9xIXk9ZJdNI0xdSlHplz7AEwyYel63jjFJXeFqZ35Zquj1HHw14_HNl_Cz8ZhDwYqvSPkXEDzjHmZ8pFkjdVUJOOcBh0Y_9SjwImx_I9gVpUU8Wk11daI0oRmoAbtdp8FdM-eRzEQ2HDp&sig=Cg0ArKJSzKOhtKxPcKU9EAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
video.php
Show response
media.oadts.com/www/delivery/
Frame BBED
|
108 KB
108 KB
|
1203ms
33ms
|
Script
text/javascript |
185.22.221.117
WAVECON
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame BBED
|
71 KB
27 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:817::2002
GOOGLE
|
|
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_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:817::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 0b7f95ea376c84f25dd1359009f53c0a00a2999c897fde63e84d8384c019f614
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
|
254 B
616 B
|
23ms
22ms
|
Image
image/png |
151.101.114.2
FASTLY
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
0
399 B
|
71ms
70ms
|
Script
text/javascript |
92.122.247.161
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
0
399 B
|
172ms
171ms
|
Script
text/javascript |
92.122.247.161
AKAMAI-AS
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=0&n121=2&n42=1&n116=0&n24=1&n104=0&n15=1&n155=0&n106=0&n153=0&n11=2&n120=6&n53=1&n154=0&n13=1&n125=0&n8=4&n2=4&n137=0&n101=0&n108=0&n54=0&n110=0&n87=0&n149=0&n76=1&n66=0&n139=1&n160=0&n107=0&n21=1&n51=1&n117=4&n86=0&n147=4&n64=1&n36=1&n119=2&n22=1&n18=1&n161=0&n126=0&n92=3&n62=1&n57=1&n77=1&n83=0&n102=0&n105=0&n159=0&n20=1&n80=1&n12=3&n141=0&n157=0&n26=1&n99=1&n128=1&n118=3&n85=0&n9=0&n6=1&n63=1&n138=0&n140=0&n94=2&n111=0&n136=0&n79=1&n93=2&n90=0&n142=0&n7=2&n103=0&n158=1&n124=0&n75=1&n91=0&n114=0&n69=0&n10=4&n3=1&n82=1&n59=1&n84=0&n5=3&n109=0&n122=2&n67=2&n115=1&n89=2&n123=1&n17=1&n78=0&n81=1&n88=0&n39=1&n156=1&n148=0&n144=1&n132=4&n133=1
- Requested by
- Host: tracking.m6r.eu
URL: https://tracking.m6r.eu/sync/api?checkcookies=true
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
92.122.247.161
, France,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a92-122-247-161.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 7A4C
|
0
0
|
40ms
40ms
|
Fetch
image/gif |
216.58.207.66
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstPGai1J1otUh669d1gj6Syvo54sgJWb3SotQFL3A2Je7Ll4yrLZeDjo4nV-8XSUKTVqiudOqz10fYJlhOedQWirE90vydDuQHQNZCq63UfDlk00PCx1EIyxlu8Jsh7fnwsjxO0tYP-qYFox06Jr4ZZFmzCXI0JsGnXAwERX50OKEmtrojruN_lDmhxRuSvPM6eu-KxTKhuSeGY_ClTc-OXaiSyrlIYwiF2fXYsxt7zgXm7p0nOjlwF2yGVpaqRYn7AgqpFNnz4HlmrtBmxe7DczCyK&sig=Cg0ArKJSzAa37o-pJpEmEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
gpt.js
Show response
www.googletagservices.com/tag/js/
Frame 7A4C
|
43 KB
14 KB
|
15ms
15ms
|
Script
text/javascript |
2a00:1450:4001:817::2002
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 7A4C
|
71 KB
27 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:817::2002
GOOGLE
|
|
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_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:817::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 0b7f95ea376c84f25dd1359009f53c0a00a2999c897fde63e84d8384c019f614
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
5303510603
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
205 B
|
86ms
23ms
|
XHR
application/json |
18.194.21.214
AMAZON-02
|
|
|
GET
H2
|
200
|
pubads_impl_2020021802.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 7A4C
|
167 KB
61 KB
|
40ms
40ms
|
Script
text/javascript |
216.58.207.66
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame 7A4C
|
113 B
178 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:817::2002
GOOGLE
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame 7A4C
|
20 KB
10 KB
|
407ms
407ms
|
XHR
text/plain |
216.58.207.66
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=389069262003290&correlator=45208986564971&output=ldjh&impl=fif&eid=21065570%2C21065517%2C21064523%2C21065304&vrg=2020021802&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200220&iu=%2F5286166%2Fgiga.de%2FDFP-Passback-728x90&sz=728x90&eri=6&cookie=ID%3Dc31ac7043b2cde9b%3AT%3D1582224383%3AS%3DALNI_MbZ00XRLmOHLR9d_kthfshHpVrj5Q&cdm=www.giga.de&bc=31&abxe=1&lmt=1582224384&dt=1582224384198&dlt=1582224384107&idt=80&ea=0&frm=23&biw=1585&bih=1200&isw=728&ish=90&oid=3&adx=429&ady=125&adk=4143599050&uci=oe2s0vn92us2&ifi=1&ifk=1641118334&u_tz=60&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.giga.de%2Fdownloads%2Firfanview%2F&top=www.giga.de&dssz=8&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=238248099.1582224383&ga_sid=1582224384&ga_hid=84226161&fws=256&ohw=0&btvi=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020021802.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 1c1eab6817bfe0b9c7755066621ade487a59992e0c82af97cadfab2fd1d230b4
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020021802.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 7A4C
|
66 KB
24 KB
|
50ms
50ms
|
Script
text/javascript |
216.58.207.66
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame 7A4C
|
0
0
|
6ms
6ms
|
Other
text/html |
2a00:1450:4001:81a::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020021802.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
DATA
|
200
OK
|
truncated
/
Frame 7A4C
|
216 B
0
|
|
Image
image/png |
|
|
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
30ms
29ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
GET
BLOB
|
200
OK
|
51909d77-cbe1-464d-8b3e-850899fffa84
https://videos.giga.de/
Frame 3227
|
31 B
0
|
|
Other
application/javascript |
|
|
|
GET
H2
|
200
|
9c760f4a3c7b447e8388337431_ciA2NTADN2E5NjRjNGU4MzM=.jpg
files.giga-video.de/70/7a/6a/
Frame 3227
|
20 KB
20 KB
|
106ms
44ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://files.giga-video.de/70/7a/6a/9c760f4a3c7b447e8388337431_ciA2NTADN2E5NjRjNGU4MzM=.jpg
- Requested by
- Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- c2c3c67c656f5bbacc8a2b3c93a33be25d48ffc482ac0276bffda46b59c1b1e3
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/
Frame 3227
|
53 B
703 B
|
96ms
26ms
|
XHR
application/json |
52.219.75.27
AMAZON-02
|
|
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame 3227
|
265 B
436 B
|
30ms
29ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
BLOB
|
200
OK
|
b0eb3273-1025-4505-94ff-fc978e8d3c8f
https://videos.giga.de/
Frame E031
|
31 B
0
|
|
Other
application/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/
Frame E031
|
53 B
703 B
|
107ms
27ms
|
XHR
application/json |
52.219.75.27
AMAZON-02
|
|
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame E031
|
265 B
436 B
|
38ms
38ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
data
lb75.s400.meetrics.net/
|
43 B
308 B
|
27ms
26ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb75.s400.meetrics.net/data?/bJUDDlRAAKktFLkqFFlqwF23A52AwwA/k0FREmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEv1F0fFvmFfwFhnFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAyyA0zA4zA5yA2BELlnFBUkzFnBPeLAAAAAAABmEYAPBAAFAAmEYTA5iAPAAAAAAFrCBA5iAZBAAOA55A55A85B55A58E55A55AFA54A15A4BErA5iAPTDAAAAFrCHA5iASksFhFjAAAAAAAAAAAAEAAAmEYAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAGAkpFylFj0FAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0fFvmFfwFhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA6AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFwyFvkF1rF0zFlpF0lFlyAGvF10FfvFmfFwhFnlFdAAAFrCxYAAAAFAAAA5iAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFHjWPUA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 3227
|
754 B
1 KB
|
158ms
23ms
|
XHR
application/json |
143.204.202.68
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame E031
|
754 B
1 KB
|
157ms
23ms
|
XHR
application/json |
143.204.202.68
AMAZON-02
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame 0DBC
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:81a::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
29ms
29ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
Frame 3227
|
201 KB
59 KB
|
49ms
27ms
|
XHR
application/javascript |
143.204.202.68
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
Frame E031
|
201 KB
59 KB
|
64ms
40ms
|
XHR
application/javascript |
143.204.202.68
AMAZON-02
|
|
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 3227
|
201 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame 3B3C
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:81a::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020021802.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- 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/
Frame 7A4C
|
73 KB
27 KB
|
14ms
13ms
|
Script
text/javascript |
2a00:1450:4001:817::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020021802.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:817::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 753def12fae8722bef366a340b5ab7c34a15c8cd8432cdddb30d8f91ab987b96
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame E031
|
201 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame 3A92
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:81a::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
29ms
28ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
GET
H2
|
200
|
5303510603
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
205 B
|
43ms
43ms
|
XHR
application/json |
18.194.21.214
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame BBED
|
43 B
402 B
|
33ms
32ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame BBED
|
43 B
402 B
|
100ms
32ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame BBED
|
43 B
402 B
|
119ms
29ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
avc.php
Show response
media.oadts.com/www/delivery/
Frame BBED
|
11 KB
12 KB
|
62ms
34ms
|
XHR
application/json |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame BBED
|
43 B
402 B
|
128ms
32ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
getAd
Show response
video-adserver.ibillboard.com/
Frame BBED
|
48 B
592 B
|
1363ms
168ms
|
XHR
text/xml |
62.168.44.126
GTSCE GTS Central...
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame BBED
|
43 B
307 B
|
63ms
32ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 7A4C
|
42 B
110 B
|
15ms
14ms
|
Image
image/gif |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstZfiH-_l4UQqXCQjamWH5d7gCYF-hh6mJsz_ON8FiJTj2AvLcbMqkLJgKWU1VZ7ba5gtJFdiNwA_xUnvEOrT7ll3ez5XpgIMy_-ChRYRc&sig=Cg0ArKJSzAAV4DnJeme9EAE&adk=1008420861&tt=-1&bs=1585%2C1200&mtos=1085,1085,1085,1085,1085&tos=1085,0,0,0,0&p=125,429,215,1157&mcvt=1085&rs=0&ht=0&tfs=105&tls=1190&mc=1<e=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1582224384110&dlt&rpt=103&isd=0&msd=0&ext&xdi=0&ps=1585%2C10949&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-2-11-11-0-0-0&tvt=1189&is=728%2C90&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200219
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/
Frame E031
|
53 B
703 B
|
33ms
32ms
|
XHR
application/json |
52.219.75.27
AMAZON-02
|
|
General
- Full URL
- https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=8699711908
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.219.75.27
Frankfurt am Main, Germany,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- s3.eu-central-1.amazonaws.com
- Software
-
AmazonS3 /
- Resource Hash
- f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame E031
|
265 B
436 B
|
58ms
58ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
General
- Full URL
- https://videos.giga.de/homad/giga-ssl.json?cache=9283611490
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
109.71.25.30
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/
Frame 3227
|
53 B
703 B
|
28ms
28ms
|
XHR
application/json |
52.219.75.27
AMAZON-02
|
|
General
- Full URL
- https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=7290942258
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.219.75.27
Frankfurt am Main, Germany,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- s3.eu-central-1.amazonaws.com
- Software
-
AmazonS3 /
- Resource Hash
- f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame 3227
|
265 B
436 B
|
51ms
51ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
General
- Full URL
- https://videos.giga.de/homad/giga-ssl.json?cache=4198868417
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
109.71.25.30
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 3227
|
754 B
1 KB
|
24ms
24ms
|
XHR
application/json |
143.204.202.68
AMAZON-02
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=8985041440
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.202.68
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-143-204-202-68.fra53.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame E031
|
754 B
1 KB
|
32ms
32ms
|
XHR
application/json |
143.204.202.68
AMAZON-02
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=7197397809
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.202.68
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-143-204-202-68.fra53.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.giga.de/dad05076c332512ed7e8f3f3a7f9660ec57c494d/
Frame 3227
|
807 B
2 KB
|
1160ms
87ms
|
XHR
application/json |
5.9.139.135
HETZNER-AS
|
|
General
- Full URL
- https://ssl.2.damoh.giga.de/dad05076c332512ed7e8f3f3a7f9660ec57c494d/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
5.9.139.135
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.135.139.9.5.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- c894038ee188c223e93dd1d92a606be67b9590fb3e4a6a0dc484bf3ae961c6ed
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.giga.de/c41703e64fb8d717dede9c007128f0b9ccf0d19b/
Frame E031
|
807 B
2 KB
|
1231ms
81ms
|
XHR
application/json |
5.9.139.135
HETZNER-AS
|
|
General
- Full URL
- https://ssl.2.damoh.giga.de/c41703e64fb8d717dede9c007128f0b9ccf0d19b/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
5.9.139.135
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.135.139.9.5.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- c894038ee188c223e93dd1d92a606be67b9590fb3e4a6a0dc484bf3ae961c6ed
|
GET
H2
|
200
|
tag
Show response
a.teads.tv/page/68592/
Frame BBED
|
1 KB
723 B
|
85ms
32ms
|
Script
application/javascript |
2.18.232.7
AKAMAI-AS
|
|
|
GET
H2
|
200
|
teads-format.min.js
Show response
a.teads.tv/media/format/v3/
|
724 KB
190 KB
|
27ms
27ms
|
Script
text/javascript |
2.18.232.7
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
index.html
cmp.teads.mgr.consensu.org/
Frame 168F
|
0
0
|
37ms
12ms
|
Document
text/html |
2a02:26f0:f3:38c::2c92
AKAMAI-ASN1
|
|
General
- Full URL
- https://cmp.teads.mgr.consensu.org/index.html
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
2a02:26f0:f3:38c::2c92
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
index.html
cmp.teads.mgr.consensu.org/
Frame 7353
|
0
0
|
34ms
11ms
|
Document
text/html |
2a02:26f0:f3:38c::2c92
AKAMAI-ASN1
|
|
General
- Full URL
- https://cmp.teads.mgr.consensu.org/index.html
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
2a02:26f0:f3:38c::2c92
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
p2
sb.scorecardresearch.com/
Redirect Chain
-
https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386877&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
-
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386877&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
|
43 B
309 B
|
69ms
37ms
|
Image
image/gif |
104.85.250.71
AKAMAI-AS
|
|
General
- Full URL
- https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386877&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=87929085&cs_ucfr=1&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
104.85.250.71
, Netherlands,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a104-85-250-71.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
1146ms
59ms
|
Image
image/gif |
72.247.225.182
AKAMAI-AS
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
1151ms
64ms
|
Image
image/gif |
72.247.225.182
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
p2
sb.scorecardresearch.com/
Redirect Chain
-
https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386897&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
-
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386897&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
|
43 B
309 B
|
64ms
31ms
|
Image
image/gif |
104.85.250.71
AKAMAI-AS
|
|
General
- Full URL
- https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386897&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=41238701&cs_ucfr=1&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
104.85.250.71
, Netherlands,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a104-85-250-71.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
1153ms
66ms
|
Image
image/gif |
72.247.225.182
AKAMAI-AS
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
1146ms
59ms
|
Image
image/gif |
72.247.225.182
AKAMAI-AS
|
|
|
GET
H2
|
200
|
ad
Show response
a.teads.tv/page/68592/
|
118 B
332 B
|
82ms
81ms
|
XHR
application/json |
2.18.232.7
AKAMAI-AS
|
|
General
- Full URL
- https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A73584%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A596%2C%22height%22%3A335%7D%2C%22slotType%22%3A%22native%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=33ea67f5-e94a-4c6e-ad8b-1c6cc06bd4e2&formatVersion=2.22.61&env=js-web&netBw=9.1&ttfb=180
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
2.18.232.7
, Ascension Island,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a2-18-232-7.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
|
GET
H2
|
200
|
ad
Show response
a.teads.tv/page/68592/
|
118 B
332 B
|
81ms
80ms
|
XHR
application/json |
2.18.232.7
AKAMAI-AS
|
|
General
- Full URL
- https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A76332%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22multislot%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=33ea67f5-e94a-4c6e-ad8b-1c6cc06bd4e2&formatVersion=2.22.61&env=js-web&netBw=9.1&ttfb=180
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
2.18.232.7
, Ascension Island,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a2-18-232-7.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
|
GET
H2
|
200
|
iframe
sync.teads.tv/
Frame 67C1
|
0
0
|
94ms
94ms
|
Document
text/html |
84.53.164.178
AKAMAI-AS
|
|
General
- Full URL
- https://sync.teads.tv/iframe?pid=76332&userId=33ea67f5-e94a-4c6e-ad8b-1c6cc06bd4e2&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&fromFormat=true&env=js-web&1582224387023
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
84.53.164.178
, Ascension Island,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a84-53-164-178.deploy.static.akamaitechnologies.com
- Software
-
akka-http/10.1.5 /
- Resource Hash
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
1022ms
62ms
|
Image
image/gif |
72.247.225.182
AKAMAI-AS
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
1021ms
63ms
|
Image
image/gif |
72.247.225.182
AKAMAI-AS
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame E031
|
2 KB
0
|
|
Image
image/png |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame E031
|
715 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
f91bbd41f24faa32fb62a637da_ciA2NTADMjJmYjQyYTI2NmQ=.jpg
files.giga-video.de/26/22/f0/
Frame E031
|
19 KB
19 KB
|
47ms
47ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://files.giga-video.de/26/22/f0/f91bbd41f24faa32fb62a637da_ciA2NTADMjJmYjQyYTI2NmQ=.jpg
- Requested by
- Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- f1ef4c669a56ec39c1623b03d8d2d4c46337bca16051509937ab377c40732c9b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.giga.de/
Frame 3227
|
24 B
409 B
|
119ms
26ms
|
XHR
application/octet-stream |
144.76.115.236
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.giga.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
144.76.115.236
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.236.115.76.144.clients.your-server.de
- Software
-
openresty/1.15.8.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 124C
|
241 B
0
|
|
Script
text/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.giga.de/
Frame E031
|
24 B
409 B
|
65ms
26ms
|
XHR
application/octet-stream |
144.76.115.236
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.giga.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
144.76.115.236
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.236.115.76.144.clients.your-server.de
- Software
-
openresty/1.15.8.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 07A3
|
241 B
0
|
|
Script
text/javascript |
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.giga.de/57a2e4b66785ea6246848024c49c5aca5b12085c/
Frame 3227
|
109 B
671 B
|
92ms
34ms
|
XHR
application/json |
5.9.139.135
HETZNER-AS
|
|
General
- Full URL
- https://ssl.2.damoh.giga.de/57a2e4b66785ea6246848024c49c5aca5b12085c/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
5.9.139.135
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.135.139.9.5.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.giga.de/478e4ef070ca11d575b184d76d31db675624d20c/
Frame E031
|
109 B
671 B
|
92ms
28ms
|
XHR
application/json |
5.9.139.135
HETZNER-AS
|
|
General
- Full URL
- https://ssl.2.damoh.giga.de/478e4ef070ca11d575b184d76d31db675624d20c/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
5.9.139.135
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.135.139.9.5.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
|
GET
H/1.1
|
200
OK
|
data
lb75.s400.meetrics.net/
|
43 B
308 B
|
80ms
26ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb75.s400.meetrics.net/data?/bJUDE+IBA/k0FeImvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEv1F0fFvmFfwFhnFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAyyA0zA4zA5yA2mEvyFthF0jFvkFl9B4tB1uFruFv3FutBzxA4zBxmAhkF29B01Az5AzwA22A20AmjEwpFk9BklFzrF0vFwmBhwFh9B1zAwzA1xAw2AwzAmjEpkF9xAz4AzwAz3A4yA51A2mAzpF6lF9zAx4EzxAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AzwAz1AxwA2wAzmAhwFk9B1zAwzA1xAw2AwzAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AyyAy0Az4A0zAx4ALlnFCUkzF2BPyCAAAAAAABo8hAPAAAFAAo8hTl5/APAAAtGA9BABl5/AZBAAOA55A55A85B55A58E55A55AGAxzA5wA04Arl5/AP6BAtGA9BAHl5/APAAAYLAaBAMl5/ASksFbFjAAAAAAAAAAAAEAAAo8hAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFFAzxA4zBxBEMAxzA4zAwzA34Ay5A12AGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA1zAwzA1xAw2AwzAGAihFuuFlyFKA1zAwzA1xAw2AwzAKA1zAwzA1xAw2AwzA1AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFwyFvkF1rF0zFlpF0lFlyAGiFhuFulFyBFdtGA9BAfAAfAAFAAAl5/AAAAAPA4tB1uFruFv3FutBzxA4zBxBEAAAAAAAAAAAAAAAAQtjFMXlcWA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb75.s400.meetrics.net/
|
43 B
308 B
|
26ms
26ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb75.s400.meetrics.net/data?/bJUDF/IBA/k0FOMmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEv1F0fFvmFfwFhnFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAyyA0zA4zA5yA2mEvyFthF0jFvkFl9B4tB1uFruFv3FutBzxA4zBxmAhkF29B01Az5AzwA22A20AmjEwpFk9BklFzrF0vFwmBhwFh9B1zAwzA1xAw2AwzAmjEpkF9xAz4AzwAz3A4yA51A2mAzpF6lF9zAx4EzxAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AzwAz1AxwA2wAzmAhwFk9B1zAwzA1xAw2AwzAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AyyAy0Az4A0zAx4AmvFytFh0FjvFklF9TEr5FzjFyhFwlFyfFx2AwmAhkF29BzzA3wA5zA31AmjEwpFk9BklFzrF0vFwmBhwFh9Bu1FssFmjEpkF9uE1sFsmBzpF6lF9xA2wA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFwyFvkF1rF0zFlpF0lFlyAGzFr5FmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA14AyyAy0Az4A34A2zALlnFDTkzFePe1AAAAAAABiqqAPAAAFAAiqqT7OtASksFXGjAAAAAAAAAAAAEAAAiqqAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAx2Aw4E2wAwBEEAu1FssFKAHvFvnFslFgBEkYFAAAAIAzzA3wA5zA31AEAu1FssFDAzrF5BFEAu1FssFEAu1FssFyAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFwyFvkF1rF0zFlpF0lFlyAGzFr5FdmUA9BAgCAYJAFAAA7OtAAAGBo0F0wFz6BvvA0wFjuBnvFvnFslFz5FukFpjFh0FpvFuuBjvFtvBzhFmlFmyFhtFlvBxtAwtAz3AvoE0tFsvBjvFu0FhpFulFyuBo0FtsFOATrF5zFjyFhwFlyFfxB2wAAAAAAAAAAAAAAAAAQtjFss+IZA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb75.s400.meetrics.net/
|
43 B
308 B
|
29ms
29ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
|
GET
BLOB
|
200
OK
|
94c6b45b-e717-45f9-8715-ef73f3e1040d
https://videos.giga.de/
Frame E031
|
5 KB
0
|
|
Other
application/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
playlist.m3u8
Show response
lx56.spieletips.de/172493/
Frame E031
|
306 B
848 B
|
117ms
27ms
|
XHR
application/octet-stream |
82.149.242.6
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
muted.png
videos.giga.de/image/plugins/automute/
Frame E031
|
1 KB
1 KB
|
29ms
28ms
|
Image
image/png |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
720p.m3u8
Show response
lx56.spieletips.de/172493/
Frame E031
|
715 B
1 KB
|
28ms
28ms
|
XHR
application/octet-stream |
82.149.242.6
HGCOMP-ASN
|
|
|
GET
BLOB
|
200
OK
|
27b4bba6-4371-4e1f-92f0-95c4c53ceb49
https://videos.giga.de/
Frame E031
|
63 KB
0
|
|
Other
application/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb75.s400.meetrics.net/
|
43 B
308 B
|
26ms
26ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb75.s400.meetrics.net/data?/bJUDHzdBA/k0FLQmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEv1F0fFvmFfwFhnFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAyyA0zA4zA5yA2mEvyFthF0jFvkFl9B4tB1uFruFv3FutBzxA4zBxmAhkF29B01Az5AzwA22A20AmjEwpFk9BklFzrF0vFwmBhwFh9B1zAwzA1xAw2AwzAmjEpkF9xAz4AzwAz3A4yA51A2mAzpF6lF9zAx4EzxAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AzwAz1AxwA2wAzmAhwFk9B1zAwzA1xAw2AwzAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AyyAy0Az4A0zAx4AmvFytFh0FjvFklF9TEr5FzjFyhFwlFyfFx2AwmAhkF29BzzA3wA5zA31AmjEwpFk9BklFzrF0vFwmBhwFh9Bu1FssFmjEpkF9uE1sFsmBzpF6lF9xA2wA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFwyFvkF1rF0zFlpF0lFlyAGzFr5FmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA14AyyAy0Az4A34A2zAmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9yEljF0hFunFslFmhEwjF9uE1sFsmBhwFk9Bu1FssFmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BHvFvnFslFgBEkYFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAyyA0zA45Ax5A1BELlnFETkzFARksFAQtjFgKIxYA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
thumbs.vtt
Show response
videos.giga.de/thumbs/172493/
Frame E031
|
4 KB
4 KB
|
33ms
33ms
|
XHR
text/vtt |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
bridge3.368.0_en.html
imasdk.googleapis.com/js/core/
Frame 8E56
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:81c::200a
GOOGLE
|
|
General
- Full URL
- https://imasdk.googleapis.com/js/core/bridge3.368.0_en.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:81c::200a
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, 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/
Frame E031
|
26 KB
10 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:821::2006
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
Frame E031
|
109 B
171 B
|
15ms
14ms
|
Script
application/javascript |
2a00:1450:4001:817::2002
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
720p00000.ts
Show response
lx56.spieletips.de/172493/
Frame E031
|
2 MB
2 MB
|
42ms
42ms
|
XHR
application/octet-stream |
82.149.242.6
HGCOMP-ASN
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
88ms
29ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
|
GET
H2
|
302
|
cc
Show response
adserver.schneevonmorgen.com/adserve/v1/
Frame E031
Redirect Chain
-
https://adserver.schneevonmorgen.com/adserve/v1/cc
-
https://adserver.schneevonmorgen.com/adserve/v1/cc?sbs=true
|
0
-1 B
|
111ms
31ms
|
XHR
application/json |
148.251.151.158
HETZNER-AS
|
|
General
- Full URL
- https://adserver.schneevonmorgen.com/adserve/v1/cc?sbs=true
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
148.251.151.158
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.158.151.251.148.clients.your-server.de
- Software
-
openresty/1.15.8.1 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15724800; includeSubDomains |
|
GET
H2
|
200
|
cc
Show response
adserver.schneevonmorgen.com/adserve/v1/
Frame E031
|
12 B
401 B
|
32ms
32ms
|
XHR
application/json |
148.251.151.158
HETZNER-AS
|
|
General
- Full URL
- https://adserver.schneevonmorgen.com/adserve/v1/cc?sbs=true
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
148.251.151.158
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.158.151.251.148.clients.your-server.de
- Software
-
openresty/1.15.8.1 /
- Resource Hash
- 3c6434ebf1fa8ad27a9f9b3d6b7d5cdd53338a11fdcd50d943872c680a5e9f3d
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15724800; includeSubDomains |
|
GET
H2
|
200
|
collect
www.google-analytics.com/r/
|
35 B
111 B
|
13ms
13ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/r/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=AdError&el=172493%20--%20winload-irfanview-video-hd.mp4%5Bvideojs%2F7.6.6%5D%5BSite%20Autoplay%5D&_u=6GBAAEAB~&jid=108954033&gjid=867366436&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&_r=1&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cd9=201406&cd11=172493&cd12=PRESS&cd13=189&cd14=true&cd19=Site%20Autoplay&cd38=videojs%2F7.6.6&cd44=0&z=1413076863
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.giga.de/0c0011adbafcf340681980962eeb41a5175ae16d/
Frame E031
|
750 B
1 KB
|
66ms
64ms
|
XHR
text/xml |
5.9.139.135
HETZNER-AS
|
|
General
- Full URL
- https://ssl.2.damoh.giga.de/0c0011adbafcf340681980962eeb41a5175ae16d/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
5.9.139.135
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.135.139.9.5.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- d401af0f09ad3c09f96937c687b06292b8e68e82f1666228b132fd6373416887
|
GET
DATA
|
200
OK
|
truncated
/
Frame E031
|
4 KB
4 KB
|
|
Font
application/font-woff |
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
110 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerStart&el=172493%20--%20winload-irfanview-video-hd.mp4%5Bvideojs%2F7.6.6%5D%5BSite%20Autoplay%5D&_u=6GBAAEAB~&jid=&gjid=&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cd9=201406&cd11=172493&cd12=PRESS&cd13=189&cd14=true&cd19=Site%20Autoplay&cd38=videojs%2F7.6.6&cd44=0&cm2=1&z=1339873833
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
103 B
|
7ms
5ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=VideoStart&el=172493%20--%20winload-irfanview-video-hd.mp4%5Bvideojs%2F7.6.6%5D%5BSite%20Autoplay%5D&_u=6GBAAEAB~&jid=&gjid=&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cd9=201406&cd11=172493&cd12=PRESS&cd13=189&cd14=true&cd19=Site%20Autoplay&cd38=videojs%2F7.6.6&cd44=0&cm5=1&z=814900497
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
720p00000.ts
Show response
lx56.spieletips.de/172493/
Frame E031
|
2 MB
2 MB
|
43ms
42ms
|
XHR
application/octet-stream |
82.149.242.6
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
720p00001.ts
Show response
lx56.spieletips.de/172493/
Frame E031
|
1 MB
1 MB
|
29ms
28ms
|
XHR
application/octet-stream |
82.149.242.6
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
720p00002.ts
Show response
lx56.spieletips.de/172493/
Frame E031
|
3 MB
3 MB
|
28ms
28ms
|
XHR
application/octet-stream |
82.149.242.6
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
720p00003.ts
Show response
lx56.spieletips.de/172493/
Frame E031
|
2 MB
2 MB
|
29ms
28ms
|
XHR
application/octet-stream |
82.149.242.6
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/r/
|
35 B
111 B
|
15ms
14ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/r/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=VideoImpression&el=172493%20--%20winload-irfanview-video-hd.mp4%5Bvideojs%2F7.6.6%5D%5BSite%20Autoplay%5D&_u=6GBAAEAB~&jid=41460079&gjid=1885820546&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&_r=1&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cd9=201406&cd11=172493&cd12=PRESS&cd13=189&cd14=true&cd19=Site%20Autoplay&cd38=videojs%2F7.6.6&cd44=0&z=858228640
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
/
Show response
track.adform.net/Serving/Cookie/
|
73 B
495 B
|
99ms
32ms
|
Script
text/javascript |
37.157.2.235
ADFORM
|
|
General
- Full URL
- https://track.adform.net/Serving/Cookie/?adfaction=getjs;adfcookname=uid
- Requested by
- Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.4f65a0e9fe0d6367b27b800ce874e982.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
37.157.2.235
, Denmark,
ASN198622
(ADFORM, DK),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains |
|
GET
H/1.1
|
200
OK
|
config.json
Show response
gocp.stroeermediabrands.de/absconf/www.giga.de/
|
22 KB
22 KB
|
117ms
33ms
|
Fetch
application/json |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
beste-grafiktools-rcm485x210.jpg
static.giga.de/wp-content/uploads/2016/08/
|
22 KB
22 KB
|
49ms
49ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
irfan-view-64-bit-bild-rcm380x210.jpg
static.giga.de/wp-content/uploads/2016/08/
|
22 KB
22 KB
|
70ms
70ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
irfanview-6-rcm350x0.jpg
static.giga.de/wp-content/gallery/irfanview_1/
|
22 KB
22 KB
|
47ms
46ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
irfanview-7-rcm350x0.jpg
static.giga.de/wp-content/gallery/irfanview_1/
|
30 KB
30 KB
|
81ms
81ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
irfanview-8-rcm350x0.jpg
static.giga.de/wp-content/gallery/irfanview_1/
|
28 KB
28 KB
|
64ms
64ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
irfanview-9-rcm350x0.jpg
static.giga.de/wp-content/gallery/irfanview_1/
|
37 KB
38 KB
|
71ms
71ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
249 B
|
6ms
6ms
|
Image
image/gif |
2a03:2880:f11c:8183:face:b00c:0:25de
FACEBOOK
|
|
|
GET
H/1.1
|
200
OK
|
t.png
gocp.stroeermediabrands.de/
|
98 B
355 B
|
83ms
28ms
|
Image
image/png |
188.40.16.106
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
88ms
29ms
|
Script
text/javascript |
23.37.42.216
AKAMAI-AS
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/285/5184/s/
|
39 KB
14 KB
|
67ms
18ms
|
Script
application/javascript |
89.163.159.104
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
1 KB
1 KB
|
212ms
51ms
|
Script
application/javascript |
194.213.222.30
GTSCE GTS Central...
|
|
|
GET
H2
|
200
|
default.js
Show response
ups.xplosion.de/loader/69511/
|
2 KB
2 KB
|
106ms
34ms
|
Script
text/javascript |
52.30.98.41
AMAZON-02
|
|
|
GET
H2
|
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
580 B
|
66ms
23ms
|
Image
image/gif |
35.186.238.175
GOOGLE
|
|
|
GET
H2
|
200
|
map
ih.adscale.de/
Frame 8214
Redirect Chain
-
https://ih.adscale.de/map?ssl=1&format=video
-
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=1431cd1356274ad2a9f4bf7759a8bcf5
|
0
0
|
157ms
157ms
|
Document
text/html |
3.124.22.230
AMAZON-02
|
|
|
GET
H2
|
200
|
launcher.js
Show response
sak.userreport.com/sdm/
|
64 KB
20 KB
|
106ms
37ms
|
Script
application/javascript |
143.204.202.74
AMAZON-02
|
|
|
GET
H2
|
200
|
segments
Show response
api.theadex.com/v0.9/pub/
|
56 B
126 B
|
78ms
22ms
|
Script
text/plain |
89.163.159.125
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
-
89.163.159.125
Cloppenburg, 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.23/
|
5 KB
2 KB
|
43ms
7ms
|
Script
application/javascript |
2600:9000:214f:5000:1c:8c89:a300:93a1
AMAZON-02
|
|
|
GET
H2
|
200
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
37ms
36ms
|
Script
text/javascript |
52.30.98.41
AMAZON-02
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=IrfanView%20Download&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%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=-1&screen=1200x1600&mbr=86421fabd0db152b1e74d1a98349514f&event_id=page_view&_sid=69511&_ver=0.2.23&_seg=jsonp&_=60433478125
- Requested by
- Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.23/p.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.30.98.41
Dublin, Ireland,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- ec2-52-30-98-41.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
- c8f4064e6956611e3005c1d88b020f2ab64d148cd765c0d248fd40cb193606ab
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
849 B
|
150ms
40ms
|
Script
application/javascript |
18.200.89.230
AMAZON-02
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
Frame FDF9
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa3BD7kWi_ABiJ0BSUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
-
https://uss.xplosion.de/usersync?sid=65966&fpid=4218649483600541032
|
42 B
661 B
|
53ms
41ms
|
Image
image/gif |
52.30.98.41
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame ECAD
|
0
0
|
134ms
34ms
|
Document
text/html |
176.34.153.100
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
720p00004.ts
Show response
lx56.spieletips.de/172493/
Frame E031
|
1 MB
1 MB
|
43ms
42ms
|
XHR
application/octet-stream |
82.149.242.6
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
|
42 B
661 B
|
37ms
37ms
|
Image
image/gif |
52.30.98.41
AMAZON-02
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
102ms
35ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
720p00005.ts
Show response
lx56.spieletips.de/172493/
Frame E031
|
3 MB
3 MB
|
42ms
42ms
|
XHR
application/octet-stream |
82.149.242.6
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
720p00006.ts
Show response
lx56.spieletips.de/172493/
Frame E031
|
4 MB
4 MB
|
45ms
44ms
|
XHR
application/octet-stream |
82.149.242.6
HGCOMP-ASN
|
|
|