GET
H2
|
200
|
Primary Request
/
Show response
www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
|
137 KB
51 KB
|
187ms
127ms
|
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
|
36ms
30ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-700.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
|
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
|
31ms
27ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-600.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
|
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
|
36ms
32ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-regular.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
|
GET
H2
|
200
|
metaTag.min.4e690207aee080cc0182c4dd8e7e39dc.js
Show response
js.stroeermediabrands.de/
|
280 KB
63 KB
|
87ms
26ms
|
Script
application/javascript |
46.253.113.178
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
lux.js
Show response
cdn.speedcurve.com/js/
|
19 KB
7 KB
|
76ms
22ms
|
Script
application/javascript |
151.101.14.217
FASTLY
|
|
General
- Full URL
- https://cdn.speedcurve.com/js/lux.js?id=131387135
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.217
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
Apache /
- Resource Hash
- a56833ce8542a71a519392f11f8351575830bd5ab43ff6ea30bbcb79dbbf2844
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
pre-352328ff0e.js
Show response
www.giga.de/static-local/dist/assets/js/
|
33 KB
11 KB
|
42ms
38ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
main-desktop-f34d9f83d5.css
www.giga.de/static-local/dist/assets/css/
|
548 KB
62 KB
|
44ms
41ms
|
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
|
91ms
34ms
|
Script
application/javascript |
91.215.100.39
INFONLINE-AS
|
|
|
GET
H/1.1
|
200
OK
|
trackcp.js
Show response
gocp.stroeermediabrands.de/
|
28 KB
11 KB
|
111ms
26ms
|
Script
application/javascript |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
2501-rcm40x40.jpg
static.giga.de/wp-content/uploads/2015/05/
|
796 B
1 KB
|
87ms
27ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2015/05/2501-rcm40x40.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- 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
- aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
|
105 KB
38 KB
|
22ms
19ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 5a0b050607d03061476a57618facae88282b14052416e63e7222fed31fc26a5d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
1.gif
www.gstatic.com/psa/static/
|
53 B
157 B
|
7ms
5ms
|
Image
image/gif |
2a00:1450:4001:800::2003
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
-
https://quiz.stroeermediabrands.de/pub/t.png?assetId=GIGA&contentId=01D6BEJQS58817042SEQCV3CEK
-
https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1
-
https://ssl-econa.met.vgwort.de/blank.gif
|
43 B
332 B
|
26ms
25ms
|
Image
image/gif |
161.156.66.178
SOFTLAYER
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
254 B
|
8ms
6ms
|
Image
image/gif |
2a03:2880:f12d:83:face:b00c:0:25de
FACEBOOK
|
|
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
44 KB
18 KB
|
8ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81a::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:81a::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
|
81ms
35ms
|
Script
application/javascript |
143.204.90.242
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
|
86ms
45ms
|
Script
application/javascript |
2.19.33.59
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
identitystatus
Show response
irqs.ioam.de/
|
25 B
203 B
|
79ms
26ms
|
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.38876058847363426
- 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
|
tx.io
Show response
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=001c&i2=001ce0a44d59a6efa5...
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=001c&i2=001ce0a44d59a6efa5...
|
0
694 B
|
25ms
24ms
|
Script
application/x-javascript |
91.215.103.65
INFONLINE-AS
|
|
General
- Full URL
- https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=001c&i2=001ce0a44d59a6efa5e609973&ep=1610005817&vr=416&id=sxnjyl&i3=001ce0a44d59a6efa5e609973%3A1613801843526%3A1583389043526%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1583389043526&n1=3&dntt=0<=1583389043529&ev=&cs=52du5p&mo=1&sr=71
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
91.215.103.65
, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- de3.ioam.de
- Software
-
nginx /
BLACKBIRD-RCV v1.06.2 0040
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
lazyload-65c07b80e0.min.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/lazyload/
|
5 KB
2 KB
|
27ms
27ms
|
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
|
27ms
27ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
176875
Show response
videos.giga.de/embed/
Frame 73F9
|
9 KB
3 KB
|
100ms
43ms
|
Document
text/html |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
giga-b2f76341c5.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
37 KB
13 KB
|
27ms
26ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
init
Show response
d.nativendo.de/cds/delivery/
|
1 KB
934 B
|
71ms
31ms
|
Script
text/javascript |
107.178.241.34
GOOGLE
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/r/
|
35 B
103 B
|
13ms
13ms
|
Image
image/gif |
2a00:1450:4001:81a::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/r/collect?v=1&_v=j81&aip=1&a=2108822051&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=4GBAAEAB~&jid=498502962&gjid=1151019849&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&z=414413561
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::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
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
171 B
|
16ms
15ms
|
Script
application/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
171 B
|
14ms
14ms
|
Script
application/javascript |
2a00:1450:4001:809::2002
GOOGLE
|
|
|
GET
H2
|
200
|
show_ads_impl_fy2019.js
Show response
pagead2.googlesyndication.com/pagead/js/r20200303/r20190131/
|
222 KB
83 KB
|
29ms
28ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20200303/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:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 984b50b44ade35d903bbfa50129e85a46a2247060ae69b55e7e595fd1f7dadde
- 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/r20200303/r20190131/
Frame FA42
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:818::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20200303/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:818::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
H/1.0
|
200
OK
|
z.js
Show response
go.giga-abs.de/
|
1 KB
1 KB
|
129ms
26ms
|
Script
text/javascript |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/z.js?0.7233112717647134
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- 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
- 74d3720dcf1dbf863d5810d6961bfdb3b13ba6f269a2c8f5627f054b6124e676
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
Cookie set
iframe
tracking.m6r.eu/pixel/
Frame D714
Redirect Chain
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
|
0
0
|
127ms
127ms
|
Document
text/html |
2.19.33.59
AKAMAI-ASN1
|
|
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/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
2.19.33.59
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a2-19-33-59.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
|
60ms
20ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
publishertag.js
Show response
static.criteo.net/js/ld/
|
96 KB
29 KB
|
63ms
28ms
|
Script
text/javascript |
2a02:2638::3
ASN-CRITEO-EUROPE
|
|
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
|
43 KB
15 KB
|
77ms
30ms
|
Script
text/javascript |
172.217.23.130
GOOGLE
|
|
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
288 KB
89 KB
|
84ms
26ms
|
Script
application/javascript |
13.224.194.92
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
126 KB
49 KB
|
79ms
27ms
|
Script
text/javascript |
23.210.248.245
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
|
75ms
34ms
|
XHR
text/plain |
2.19.33.59
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
nuggad
Show response
nugmw.userreport.com/rc-ap/f185cb89-b780-4c4c-aeb7-b254025a5538/si.nuggad.net/
Redirect Chain
-
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
-
https://nugmw.userreport.com/rc-ap/f185cb89-b780-4c4c-aeb7-b254025a5538/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2...
|
2 KB
2 KB
|
36ms
20ms
|
Script
text/javascript |
2600:9000:21f3:f600:1f:a1b:34c0:93a1
AMAZON-02
|
|
General
- Full URL
- https://nugmw.userreport.com/rc-ap/f185cb89-b780-4c4c-aeb7-b254025a5538/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2600:9000:21f3:f600:1f:a1b:34c0:93a1
, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- 8f22ebb48904dc39955840ec9dc81566a490b33f06367760e989f345abb62b85
|
GET
H2
|
200
|
SDG_CookieLayer.min.js
Show response
cdn.stroeerdigitalgroup.de/metatag/libraries/
|
15 KB
3 KB
|
25ms
8ms
|
Script
application/javascript |
2a02:26f0:eb:181::5f76
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
/
Show response
quiz.stroeermediabrands.de/pub/meta/
|
272 B
631 B
|
107ms
44ms
|
XHR
application/json |
46.253.113.181
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
102 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:81a::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd21=auto&cm17=1&cd18=4282584&z=1303137423
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::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
|
144ms
23ms
|
Image
image/png |
3.124.69.248
AMAZON-02
|
|
|
GET
H2
|
200
|
post-4661cc0bdf.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
7 KB
3 KB
|
27ms
26ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
dkuim.js
Show response
dkuim.de/api/js/2/
|
465 KB
151 KB
|
158ms
43ms
|
Script
application/javascript |
178.19.65.130
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
|
30ms
29ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/smb-phone-plan-ef34ebe4f8.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
107 B
493 B
|
260ms
260ms
|
XHR
text/javascript |
143.204.90.242
AMAZON-02
|
|
General
- Full URL
- https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=Gjn8ESw4oOrnf&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.90.242
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-143-204-90-242.fra50.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
|
64ms
20ms
|
XHR
application/javascript |
143.204.90.242
AMAZON-02
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
96 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:81a::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=visible&el=4282584&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd21=auto&cm18=1&z=381964787
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::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
|
amazon-payments-rct415x210u.jpg
static.giga.de/wp-content/uploads/2011/04/
|
10 KB
10 KB
|
42ms
41ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2011/04/amazon-payments-rct415x210u.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- 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
- d665ad6762076513f3ad8d02bc1246a6bcf75d4df5da456aae49976b2243adf7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
Wie-funktioniert-Sofortueberweisung-Anleitung-rct200x210u.png
static.giga.de/wp-content/uploads/2015/06/
|
7 KB
8 KB
|
28ms
27ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2015/06/Wie-funktioniert-Sofortueberweisung-Anleitung-rct200x210u.png
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- 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
- dd93ca83e5a29b494b970f63833ffec494690063a0ef5bafca4c4d9c889e5fdc
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
jquery.min.js
Show response
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
|
85 KB
30 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:809::200a
GOOGLE
|
|
General
- Full URL
- https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::200a
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
kwiss-69d2e3a105.js
Show response
www.giga.de/static-local/dist/assets/js/components/
|
5 KB
2 KB
|
34ms
33ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
article-rating-7143c629e5.js
Show response
www.giga.de/static-local/dist/assets/js/components/
|
306 B
534 B
|
33ms
33ms
|
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
|
29ms
14ms
|
Script
application/javascript |
2606:4700:20::681a:5fb
CLOUDFLARENET
|
|
|
GET
H2
|
200
|
videojs-c972511a.min.js
Show response
videos.giga.de/dist/js/embed/bundle/
Frame 73F9
|
619 KB
206 KB
|
47ms
47ms
|
Script
application/javascript |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
Frame 73F9
|
264 KB
90 KB
|
39ms
38ms
|
Script
text/javascript |
2a00:1450:4001:806::200a
GOOGLE
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 0E5C
|
0
0
|
301ms
300ms
|
Document
text/html |
2a00:1450:4001:818::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1459277723&w=468&lmt=1583389043&psa=0&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&adsid=NT&dt=1583389043622&bpp=14&bdt=227&fdt=104&idt=104&shv=r20200303&cbv=r20190131&ptt=9&saldr=aa&abxe=1&correlator=5072409614088&frm=20&pv=2&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&ga_fc=0&iag=0&icsg=13210925151038&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=450&biw=1585&bih=1200&scr_x=0&scr_y=0&oid=3&pvsid=4221733706430658&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=upU0N5Urlg&p=https%3A//www.giga.de&dtd=121
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200303/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::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
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:814::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/r20200303/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 88b230f7cc8dcdf4ac2d71c5537f063d2be6b51ecf10df6ba04bb53a0062b9f2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
videojs-f50f7a8d.css
videos.giga.de/dist/css/
Frame 73F9
|
53 KB
15 KB
|
40ms
40ms
|
Stylesheet
text/css |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
play_button.svg
videos.giga.de/image/
Frame 73F9
|
1015 B
1 KB
|
41ms
41ms
|
Image
image/svg+xml |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
dmp
Show response
tracking.m6r.eu/sync/
|
97 B
620 B
|
39ms
39ms
|
XHR
application/json |
2.19.33.59
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame BC4F
|
0
0
|
19ms
18ms
|
Document
text/html |
2a00:1450:4001:818::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1583389043&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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1583389043677&bpp=5&bdt=281&fdt=102&idt=102&shv=r20200303&cbv=r20190131&ptt=9&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=5072409614088&frm=20&pv=1&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&ga_fc=0&iag=0&icsg=13210925151038&dssz=68&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&oid=3&pvsid=4221733706430658&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=113
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200303/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::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
|
collect
www.google-analytics.com/
|
35 B
96 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:81a::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Quiz%20Teaser%202017&ea=embed&el=01afe2c2-c1b4-48d2-948d-59a2d9b73b9b&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd20=01afe2c2-c1b4-48d2-948d-59a2d9b73b9b&cd25=auto&cd27=SurveyQuestion&cm53=1&z=463609115
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::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
|
loader.js
Show response
cdn.taboola.com/libtrc/stroeer-smb-giga/
|
199 KB
29 KB
|
20ms
20ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
96 B
|
7ms
6ms
|
Image
image/gif |
2a00:1450:4001:81a::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=deutsche%20Paypal-Webseite&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cd45=all&cm75=1&z=2018870193
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::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
96 B
|
7ms
5ms
|
Image
image/gif |
2a00:1450:4001:81a::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal-Login-Seite&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cd45=all&cm75=1&z=1835039826
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::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
96 B
|
9ms
8ms
|
Image
image/gif |
2a00:1450:4001:81a::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Login-Seite&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%203&cd45=all&cm75=1&z=1951221832
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::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
96 B
|
9ms
7ms
|
Image
image/gif |
2a00:1450:4001:81a::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Hier%20loggt%20ihr%20euch%20in%20Paypal%20ein.&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%204&cd45=all&cm75=1&cd39=Image&z=1375673850
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::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
96 B
|
8ms
7ms
|
Image
image/gif |
2a00:1450:4001:81a::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Android)%20downloaden&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmy&cd41=Content%205&cd45=all&cm75=1&z=1690338649
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::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
96 B
|
8ms
6ms
|
Image
image/gif |
2a00:1450:4001:81a::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=10&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(iOS)%20downloaden&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmz&cd41=Content%206&cd45=all&cm75=1&z=1876497860
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::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
96 B
|
10ms
8ms
|
Image
image/gif |
2a00:1450:4001:81a::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=11&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Windows%20Phone)%20downloaden&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixn0&cd41=Content%207&cd45=all&cm75=1&z=268119679
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::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
|
pixel.gif
static.criteo.net/images/
|
43 B
260 B
|
16ms
16ms
|
Image
image/gif |
2a02:2638::3
ASN-CRITEO-EUROPE
|
|
|
GET
H2
|
200
|
pixel.gif
static.criteo.net/images/
|
43 B
260 B
|
15ms
15ms
|
Image
image/gif |
2a02:2638::3
ASN-CRITEO-EUROPE
|
|
|
GET
H2
|
200
|
smb-article-rating-f9506c2d61.min.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/
|
18 KB
6 KB
|
33ms
32ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/smb-article-rating-f9506c2d61.min.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
|
GET
H2
|
200
|
kwissc.js
Show response
quiz.stroeermediabrands.de/static/client/
|
227 KB
80 KB
|
36ms
36ms
|
Script
application/javascript |
46.253.113.181
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
doT.min.js
Show response
cdnjs.cloudflare.com/ajax/libs/dot/1.0.3/
|
3 KB
2 KB
|
15ms
14ms
|
Script
application/javascript |
2606:4700::6811:4104
CLOUDFLARENET
|
|
General
- Full URL
- https://cdnjs.cloudflare.com/ajax/libs/dot/1.0.3/doT.min.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700::6811:4104
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- d032695018480726794e6e6eff112f7116a5122bb269d22dc77f3516604a1c1e
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15780000; includeSubDomains |
|
GET
H2
|
200
|
bootstrap.min.js
Show response
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
|
36 KB
10 KB
|
29ms
11ms
|
Script
text/javascript |
2001:4de0:ac19::1:b:1a
HIGHWINDS3
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
3 KB
2 KB
|
40ms
39ms
|
Script
text/javascript |
2.19.33.59
AKAMAI-ASN1
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
27ms
26ms
|
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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&__id=1583389043886&__it=-60&__ic=727391&__iq=ebe1747b80ed5166ae77b1018b0ac49f&__ig=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- 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
|
pubads_impl_2020022701.js
Show response
securepubads.g.doubleclick.net/gpt/
|
164 KB
60 KB
|
38ms
38ms
|
Script
text/javascript |
172.217.23.130
GOOGLE
|
|
|
POST
H2
|
204
|
session
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
63ms
20ms
|
XHR
text/plain |
35.156.162.45
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
submit
lb46.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
114ms
27ms
|
Image
image/gif |
136.243.3.132
HETZNER-AS
|
|
General
- Full URL
- https://lb46.s400.meetrics.net/bb-mx/submit?/K06kBSAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FoywAx5AtxAxtAy1AtxAx6Aw4At2A35A2wAwtAyuAxxA1uAytAkzB0zAlkFimFL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BEOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSr+APAAAAAAAAAOAAAAGBAAAAAAZwSr+ABRksFAQtjF6o7BTA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.132
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h224.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb46.s400.meetrics.net/
|
43 B
308 B
|
112ms
25ms
|
Image
image/gif |
136.243.3.132
HETZNER-AS
|
|
|
GET
H2
|
200
|
nuggad
ih.adscale.de/
|
49 B
283 B
|
20ms
20ms
|
Image
image/gif |
18.185.150.7
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
3 KB
2 KB
|
44ms
44ms
|
Script
text/javascript |
2.19.33.59
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n121=1&n116=0&n104=1&n15=2&n155=1&n135=6&n106=0&n153=0&n11=1&n120=2&n154=1&n125=1&n8=1&n2=6&n137=0&n101=0&n108=1&n54=0&n110=1&n87=0&n149=0&n76=1&n66=0&n60=1&n139=1&n160=0&n107=1&n21=1&n40=1&n117=4&n86=0&n147=4&n64=0&n119=3&n22=1&n18=1&n161=1&n126=0&n92=3&n57=1&n77=0&n83=0&n102=1&n105=0&n159=1&n20=1&n80=1&n12=1&n141=0&n157=0&n99=1&n128=1&n118=3&n85=0&n9=2&n6=2&n63=0&n58=1&n138=0&n140=0&n94=2&n111=1&n136=0&n79=1&n93=4&n90=0&n142=0&n7=1&n103=1&n158=0&n124=0&n75=0&n91=0&n114=0&n69=0&n47=1&n10=3&n3=1&n82=1&n84=0&n5=3&n109=0&n122=1&n67=1&n115=1&n89=1&n123=2&n17=1&n78=0&n44=1&n81=1&n88=0&n39=1&n156=0&n148=1&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
-
2.19.33.59
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a2-19-33-59.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- 3786b76d0a2f48f6cf804db8b9779095c2b97d335f7000863b9d19a1d46a2d62
|
GET
H2
|
200
|
nativendo.css
c.nativendo.de/cdn/asset/css/
|
6 KB
2 KB
|
10ms
10ms
|
Stylesheet
text/css |
2606:4700:20::681a:5fb
CLOUDFLARENET
|
|
|
GET
H2
|
200
|
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/
Frame 73F9
|
30 KB
30 KB
|
110ms
38ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://files.giga-video.de/75/ed/96/145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- 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
- 00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
ForumViewTopicContentAD.Cj3s-YOGFGen4.png
www.giga.de/special/gutscheine/
|
71 B
273 B
|
40ms
40ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/special/gutscheine/ForumViewTopicContentAD.Cj3s-YOGFGen4.png
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
TSAdServer
- Resource Hash
- 790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
102 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:81a::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=12&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=176875%20--%20so-funktioniert-paypal-hd.mp4%5Bvideojs%2F7.6.6%5D%5BUser%20Click2Play%5D&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd9=201406&cd11=176875&cd12=PRESS&cd13=62&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.6&cd44=1&cm1=1&z=857859608
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::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
BLOB
|
200
OK
|
dd40974c-3bd7-44a9-8e9b-8ed96f01064a
https://videos.giga.de/
Frame 73F9
|
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 73F9
|
53 B
703 B
|
84ms
24ms
|
XHR
application/json |
52.219.74.159
AMAZON-02
|
|
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame 73F9
|
265 B
436 B
|
27ms
26ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
iu3
aax-eu.amazon-adsystem.com/s/
Frame E736
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
|
206ms
205ms
|
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
|
impl.20200304-8-RELEASE.js
Show response
cdn.taboola.com/libtrc/
|
444 KB
126 KB
|
25ms
23ms
|
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
|
68ms
20ms
|
Script
application/x-javascript |
23.43.115.95
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=886c72288fc395da52cf164886d37815&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D886c72288fc395da52cf164886d37815%2...
-
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=886c72288fc395da52cf164886d37815&userId=adscale-user:d1136d32b0c44146805631960db8a8b8
|
44 B
574 B
|
43ms
43ms
|
Image
image/gif |
2.19.33.59
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
setuid
ib.adnxs.com/
Redirect Chain
-
https://tracking.m6r.eu/sync/appnexusRedirect
-
https://ib.adnxs.com/setuid?entity=197&code=61ea3ca9ef64d8973baa907809a0b408
|
43 B
873 B
|
18ms
17ms
|
Image
image/gif |
185.33.223.209
ASN-APPNEX
|
|
|
GET
H/1.1
|
200
OK
|
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=iGxyKI_DldpSzxZIhtN4FQ
-
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
|
44 B
569 B
|
48ms
47ms
|
Image
image/gif |
2.19.33.59
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
204
No Content
|
m
ad.yieldlab.net/
Redirect Chain
-
https://tracking.m6r.eu/sync/yieldlabRedirect
-
https://ad.yieldlab.net/m?dt_id=36356&ext_id=61ea3ca9ef64d8973baa907809a0b408
|
0
360 B
|
28ms
27ms
|
Image
text/plain |
2.16.122.151
AKAMAI-ASN1
|
|
|
POST
H2
|
204
|
bid
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
20ms
20ms
|
XHR
text/plain |
35.156.162.45
AMAZON-02
|
|
|
POST
H2
|
204
|
auction
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
20ms
20ms
|
XHR
text/plain |
35.156.162.45
AMAZON-02
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
3 KB
2 KB
|
70ms
70ms
|
XHR
text/plain |
172.217.23.130
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4221733706430658&correlator=1279517699276274&output=ldjh&impl=fif&adsid=NT&eid=21064212%2C21065575&vrg=2020022701&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200305&iu_parts=4444%2Cgiga.de_sd%2Csoftware_artikel&enc_prev_ius=0%2F1%2F2&prev_iu_szs=1x1&ists=1&prev_scp=as%3Dout_of_page%26adslot%3Dout_of_page%26af%3Dds%2Ctickerad%2Cfloor%26pc%3D1&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%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D11%26smb-hour%3D7%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%26mbrid%3D886c72288fc395da52cf164886d37815%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn135-6%252Cn106-0%252Cn153-0%252Cn11-1%252Cn120-2%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-6%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-1%252Cn21-1%252Cn40-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-0%252Cn92-3%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-1%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-2%252Cn6-2%252Cn63-0%252Cn58-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-1%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-0%252Cn142-0%252Cn7-1%252Cn103-1%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-0%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-1%252Cn133-1%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1583389044&dt=1583389044200&dlt=1583389043395&idt=773&frm=20&biw=1585&bih=1200&oid=3&adxs=0&adys=3879&adks=2540211652&ucis=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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=79&icsg=1100062243357216&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1585x1&msz=1585x1&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&fws=0&ohw=0&btvi=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.130
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s18-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e4e5ee42d5bf59640b6c8cc1429b54065f5c71df4b1bb4d48fd7263e752d2f21
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020022701.js
Show response
securepubads.g.doubleclick.net/gpt/
|
69 KB
25 KB
|
32ms
31ms
|
Script
text/javascript |
172.217.23.130
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
|
0
0
|
6ms
5ms
|
Other
text/html |
2a00:1450:4001:819::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_2020022701.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
8 KB
4 KB
|
269ms
268ms
|
XHR
text/plain |
172.217.23.130
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4221733706430658&correlator=1279517699276274&output=ldjh&impl=fif&adsid=NT&eid=21064212%2C21065575&vrg=2020022701&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200305&iu_parts=4444%2Cgiga.de_sd%2Csoftware_artikel&enc_prev_ius=0%2F1%2F2&prev_iu_szs=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C468x60%7C728x90%7C728x180%7C31x31&prev_scp=as%3Dbanner%26adslot%3Dbanner%26af%3Dds%2Cf2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cfullb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cvto%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&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%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D11%26smb-hour%3D7%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%26mbrid%3D886c72288fc395da52cf164886d37815%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn135-6%252Cn106-0%252Cn153-0%252Cn11-1%252Cn120-2%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-6%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-1%252Cn21-1%252Cn40-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-0%252Cn92-3%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-1%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-2%252Cn6-2%252Cn63-0%252Cn58-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-1%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-0%252Cn142-0%252Cn7-1%252Cn103-1%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-0%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-1%252Cn133-1%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1583389044&dt=1583389044218&dlt=1583389043395&idt=773&frm=20&biw=1585&bih=1200&oid=3&adxs=293&adys=125&adks=1727577002&ucis=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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=80&icsg=1100062243357216&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x10&msz=1000x10&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&fws=0&ohw=0&btvi=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.130
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s18-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 94ee2b6f661c7f0859d383dc0ee7d8a6abd81ae9b1db4c74a19a03360782fbea
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
8 KB
4 KB
|
462ms
461ms
|
XHR
text/plain |
172.217.23.130
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4221733706430658&correlator=1279517699276274&output=ldjh&impl=fif&adsid=NT&eid=21064212%2C21065575&vrg=2020022701&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200305&iu_parts=4444%2Cgiga.de_sd%2Csoftware_artikel&enc_prev_ius=0%2F1%2F2&prev_iu_szs=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&prev_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%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D11%26smb-hour%3D7%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%26mbrid%3D886c72288fc395da52cf164886d37815%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn135-6%252Cn106-0%252Cn153-0%252Cn11-1%252Cn120-2%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-6%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-1%252Cn21-1%252Cn40-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-0%252Cn92-3%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-1%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-2%252Cn6-2%252Cn63-0%252Cn58-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-1%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-0%252Cn142-0%252Cn7-1%252Cn103-1%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-0%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-1%252Cn133-1%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1583389044&dt=1583389044225&dlt=1583389043395&idt=773&frm=20&biw=1585&bih=1200&oid=3&adxs=1318&adys=125&adks=2778923653&ucis=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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=80&icsg=1100062243357216&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=10x40&msz=10x40&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&fws=0&ohw=0&btvi=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.130
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s18-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 3b142ebd13e469a013283908b7b1ea8c24126fcc1e1e94d6a7fc57efcd8d3ff8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
8 KB
4 KB
|
660ms
659ms
|
XHR
text/plain |
172.217.23.130
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4221733706430658&correlator=1279517699276274&output=ldjh&impl=fif&adsid=NT&eid=21064212%2C21065575&vrg=2020022701&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200305&iu_parts=4444%2Cgiga.de_sd%2Csoftware_artikel&enc_prev_ius=0%2F1%2F2&prev_iu_szs=10x20%7C10x10%7C300x250%7C34x31&prev_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%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D11%26smb-hour%3D7%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%26mbrid%3D886c72288fc395da52cf164886d37815%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn135-6%252Cn106-0%252Cn153-0%252Cn11-1%252Cn120-2%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-6%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-1%252Cn21-1%252Cn40-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-0%252Cn92-3%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-1%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-2%252Cn6-2%252Cn63-0%252Cn58-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-1%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-0%252Cn142-0%252Cn7-1%252Cn103-1%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-0%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-1%252Cn133-1%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1583389044&dt=1583389044233&dlt=1583389043395&idt=773&frm=20&biw=1585&bih=1200&oid=3&adxs=968&adys=265&adks=1428895410&ucis=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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=80&icsg=1100062243357216&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x20&msz=300x20&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&fws=0&ohw=0&btvi=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.130
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s18-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 7e7eeed9bbaf12534f8daf84968ea468d995221e958545e42f4afa6626afdef6
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 73F9
|
754 B
1 KB
|
109ms
22ms
|
XHR
application/json |
143.204.101.32
AMAZON-02
|
|
|
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
|
77ms
22ms
|
Script
text/javascript |
151.101.13.194
FASTLY
|
|
|
GET
H/1.1
|
200
OK
|
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=61ea3ca9ef64d8973baa907809a0b408&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D61ea3ca9ef64d8973baa907809a0b408%2...
-
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=61ea3ca9ef64d8973baa907809a0b408&userId=adscale-user:d1136d32b0c44146805631960db8a8b8
|
44 B
574 B
|
63ms
62ms
|
Image
image/gif |
2.19.33.59
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=Yeo8qe9k2Jc7qpB4CaC0CA
-
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
|
44 B
569 B
|
43ms
43ms
|
Image
image/gif |
2.19.33.59
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
/
Show response
d.nativendo.de/cds/delivery/get/
|
2 KB
1 KB
|
85ms
85ms
|
Script
text/javascript |
107.178.241.34
GOOGLE
|
|
|
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=1583389044284&ns_c=UTF-8&cv=3.5&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%...
-
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1583389044284&ns_c=UTF-8&cv=3.5&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps...
|
0
248 B
|
23ms
23ms
|
Image
text/plain |
23.43.115.95
AKAMAI-ASN1
|
|
General
- Full URL
- https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1583389044284&ns_c=UTF-8&cv=3.5&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.43.115.95
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a23-43-115-95.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/
Frame 14EA
Redirect Chain
-
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjss_ond604jtIed4RQtquEAB2WIkDvAkFII3VhhxxKcn7XgPULG0W3bZn_UuT88xaJO77hvVLqgaBp-zhAy8L4gnRX1F_YSW3NfiqdfdM89Y0Y-koDLu4eFP04yPzvLiZFmPtsr3By0pC...
-
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
|
49 B
343 B
|
9ms
8ms
|
Image
image/gif |
2a02:26f0:eb:181::5f76
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
json
Show response
trc.taboola.com/stroeer-smb-giga/trc/3/
|
17 KB
7 KB
|
214ms
167ms
|
Script
application/javascript |
151.101.14.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=07%3A17%3A24.340<i=deflated&data=%7B%22id%22%3A127%2C%22ii%22%3A%22%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%22%2C%22it%22%3A%22text%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1583389043796%2C%22cv%22%3A%2220200304-8-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%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%3A3901%2C%22r%22%3A%5B%7B%22li%22%3A%22rbox-t2m%22%2C%22s%22%3A9%2C%22uim%22%3A%22alternating-thumbnails-a%3Aabp%3D0%22%2C%22uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22orig_uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22cd%22%3A3218.3125%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.20200304-8-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
- 8bb09124900f5a4358b9d696d5723f9c495bc5e0d0966b2a097efc2f575c8947
|
GET
H/1.1
|
200
OK
|
pixel
tracking.m6r.eu/consent/
|
44 B
209 B
|
61ms
60ms
|
Image
image/gif |
2.19.33.59
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/202003031018/
|
32 KB
12 KB
|
24ms
24ms
|
Script
application/javascript |
151.101.13.194
FASTLY
|
|
General
- Full URL
- https://confiant-integrations.global.ssl.fastly.net/prebid/202003031018/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
- 31f25dee720c1cc57694de1ed117f8a5b34c0899c453223cde12bbcab7518416
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
Frame 73F9
|
200 KB
58 KB
|
24ms
21ms
|
XHR
application/javascript |
143.204.101.32
AMAZON-02
|
|
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 73F9
|
200 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame B57A
|
0
0
|
34ms
33ms
|
Fetch
image/gif |
172.217.23.130
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssLn-wmH-snpxkx3ENNR9976cFD2BBIPakdzMbrr9-JqWqIBVfD6fqUAjOq9XSbAww8j17k4sc90n6EsbPEOIKBe-oESnUkQn0UDNA4Law9pskxnyg1jU0F6Zr-vblMB2izaY2n3Ko_ekvd3MAhrsXJ4MDwU3yjSJE6N90itIwHrdslZX_tj-iVM-cEY-pJbKufHkEt6T5FlK8beRAfYn8qhM8P5p17y-8hiCq2RB-E2vyyiZHsvEoFcLLzq00nYb6Zzmeckm9LHpQAlwmr&sig=Cg0ArKJSzNXaQN2X1NuVEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.130
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s18-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 B57A
|
43 KB
14 KB
|
15ms
15ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame B57A
|
73 KB
28 KB
|
23ms
23ms
|
Script
text/javascript |
2a00:1450:4001:814::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_2020022701.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 31eef561438773aa8905d73dfe2e8400eca13620146d6235c6e019a828bd33fe
- 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
|
67ms
23ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
pubads_impl_2020022701.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame B57A
|
164 KB
60 KB
|
32ms
30ms
|
Script
text/javascript |
172.217.23.130
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame B57A
|
113 B
178 B
|
15ms
14ms
|
Script
application/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
|
GET
H2
|
200
|
modify-fv-return-position.js
Show response
cdn.taboola.com/ui-ab-tests/modify-fv-return-position/
|
2 KB
1 KB
|
20ms
20ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
tb
Show response
15.taboola.com/
|
32 KB
33 KB
|
90ms
41ms
|
Script
text/html |
151.101.14.49
FASTLY
|
|
General
- Full URL
- https://15.taboola.com/tb?oid=15&pubnm=stroeer-smb-giga&unitType=244&tbloc=&pageType=text&pstn=Below%20Article%20Feed%20-%20Video&uuip=Feed%20-%20Below%20Article%20Feed%20-%20Video&cisrf=&cirf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&encoded=1&uid=28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4&variant=0|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1583389044565&tagid=&cntry=BE&platform=1&sesid=e50b912300de59dc88f69ca85520f641&itemid=/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme&viewid=1583389043796&geolat=&geoing=&deviceifa=&appid=&sd=v2_e50b912300de59dc88f69ca85520f641_28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4_1583389044_1583389044_CNawjgYQrMVBGNTY3cqKLiABKAEwFjjqxgdA4YYQSN2b1QFQ____________AVgAYABo5YTr_anMs6vkAQ&ri=eb45f7eb7bbbbe84add99742023f559a&appname=&cdb=&gdprApplies=&rid=&sii=333075201540415599&oee=true&tpubid=1073836&uis=2
- Requested by
- Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20200304-8-RELEASE.js
- 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
- eeeadfeed3d3cf8974df0e53ef6a002dcaa84433c501fcc574416d5af9bc645e
|
GET
H2
|
200
|
feed-card-placeholder.20200304-8-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
5 KB
1 KB
|
20ms
20ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
f89e1763-220d-4e09-ba69-9e040548fb7a.svg
cdn.taboola.com/static/f8/
|
4 KB
2 KB
|
21ms
21ms
|
Image
image/svg+xml |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
userx.20200304-8-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
22 KB
8 KB
|
20ms
20ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
204
|
rtb-h
trc.taboola.com/sg/exposebox-network/1/
Frame 786F
Redirect Chain
-
https://server.exposebox.com/rcm
-
https://trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_2go82tcbo7w
|
0
50 B
|
33ms
31ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
200
|
match
match.zorosrv.com/
Frame 786F
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=826423ba-2c35-42b5-b225-309c6aaf7dc8
-
https://match.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=826423ba-2c35-42b5-b225-309c6aaf7dc8&tbid=28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4&query=taboola_hm%3D826423ba-2c35-...
-
https://match.zorosrv.com/match?tabid=28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4&extuid=826423ba-2c35-42b5-b225-309c6aaf7dc8&excid=218&query=taboola_hm%3D826423ba-2c35-42b5-b225-309c6aaf7dc8
|
0
317 B
|
31ms
30ms
|
Image
text/plain |
151.101.14.49
FASTLY
|
|
General
- Full URL
- https://match.zorosrv.com/match?tabid=28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4&extuid=826423ba-2c35-42b5-b225-309c6aaf7dc8&excid=218&query=taboola_hm%3D826423ba-2c35-42b5-b225-309c6aaf7dc8
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- 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 786F
|
0
239 B
|
1145ms
35ms
|
Image
image/gif |
69.173.144.139
RUBICONPROJECT
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/
Frame 786F
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=W4Y2794f3yXpXYxZMk9cFSO1ypu5aHIZh1HLYpQKmNw%3D
|
45 B
96 B
|
32ms
32ms
|
Image
image/gif |
151.101.14.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=W4Y2794f3yXpXYxZMk9cFSO1ypu5aHIZh1HLYpQKmNw%3D
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- 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
- dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
|
GET
H2
|
200
|
/
trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/
Frame 786F
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=32ba5e60-997e-4b00-bb9a-e84a0f614c13
-
https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=32ba5e60-997e-4b00-bb9a-e84a0f614c13
|
0
262 B
|
30ms
30ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
|
GET
|
|
rtset
bh.contextweb.com/bh/
Frame 786F
|
0
0
|
|
|
|
|
|
GET
H2
|
204
|
/
trc.taboola.com/sg/rtbhouse-network/1/rtb-h/
Frame 786F
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=AKT5bJYtOlH3fBv0Mc0S&pi=taboola&tc=1
|
0
196 B
|
31ms
30ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
|
GET
H/1.1
|
200
OK
|
getuidnb
ib.adnxs.com/
Frame 786F
|
43 B
690 B
|
22ms
19ms
|
Image
image/gif |
185.33.223.209
ASN-APPNEX
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/google-network/1/rtb-h/
Frame 786F
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=CAESEJaYg1pgQP9lmk-NLfvRnOU&google_cver=1
|
0
55 B
|
31ms
31ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEJaYg1pgQP9lmk-NLfvRnOU&google_cver=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- 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
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
getuidnb
ib.adnxs.com/
Frame 786F
|
43 B
691 B
|
39ms
17ms
|
Image
image/gif |
185.33.223.209
ASN-APPNEX
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/thetradedesk-network/1/rtb-h/
Frame 786F
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=c97255c2-431c-4b10-b60f-ade4181269b6
|
0
207 B
|
33ms
31ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
200
|
rtb-h
trc.taboola.com/sg/storygize-network/1/
Frame 786F
Redirect Chain
-
https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4
-
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
|
0
59 B
|
32ms
31ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- 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
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
cookiesync
bttrack.com/pixel/
Frame 786F
|
35 B
380 B
|
1411ms
101ms
|
Image
image/gif |
192.132.33.46
BIDTELLECT
|
|
|
GET
H/1.1
|
204
No Content
|
/
cds.taboola.com/
Frame 786F
|
0
176 B
|
1304ms
94ms
|
Image
text/plain |
141.226.224.32
TABOOLA-AS
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/bidswitch-network/1/rtb-h/
Frame 786F
Redirect Chain
-
https://x.bidswitch.net/sync?ssp=taboola
-
https://x.bidswitch.net/ul_cb/sync?ssp=taboola
-
https://px.adhigh.net/p/cm/bsw?bidswitch_ssp_id=taboola
-
https://px.adhigh.net/p/cm/bsw?bidswitch_ssp_id=taboola&bounced=1
-
https://x.bidswitch.net/sync?dsp_id=9&user_id=J1K1E3zDYm.AikABlFwqVdyMQ&expires=30&ssp=taboola
-
https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=78f8a296-27f6-4e6e-812e-8247c871369b
|
0
202 B
|
31ms
30ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=78f8a296-27f6-4e6e-812e-8247c871369b
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- 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
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
102 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:81a::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=13&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cm73=1&cm13=1&z=1113223306
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81a::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
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
21ms
21ms
|
XHR
text/plain |
35.156.162.45
AMAZON-02
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame B57A
|
19 KB
8 KB
|
283ms
282ms
|
XHR
text/plain |
172.217.23.130
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3831497916287387&correlator=3997275594468860&output=ldjh&impl=fif&eid=21065575&vrg=2020022701&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200305&iu_parts=5286166%2Cgiga.de%2CDFP-Passback-728x90&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=728x90&eri=6&cookie=ID%3D2ce47321758371f6%3AT%3D1583389044%3AS%3DALNI_MbBndNf_a5TygxPbyEQbMDiOdtl5w&cdm=www.giga.de&bc=31&abxe=1&lmt=1583389044&dt=1583389044633&dlt=1583389044513&idt=113&ea=0&frm=23&biw=1585&bih=1200&isw=728&ish=90&oid=3&adxs=429&adys=125&adks=4143599050&ucis=s6am9y4whjfd&ifi=1&ifk=215055865&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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&top=www.giga.de&dssz=8&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=468571453.1583389044&ga_sid=1583389045&ga_hid=606509478&fws=256&ohw=0&btvi=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.130
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s18-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 870acd964c14c5e6e4b24de8d61c926b924d69f88a540430234e8a90783ab4fb
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020022701.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame B57A
|
69 KB
25 KB
|
31ms
30ms
|
Script
text/javascript |
172.217.23.130
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame B57A
|
0
0
|
6ms
5ms
|
Other
text/html |
2a00:1450:4001:819::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_2020022701.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
DATA
|
200
OK
|
truncated
/
Frame B57A
|
213 B
0
|
|
Image
image/png |
|
|
|
POST
H2
|
204
|
bulk
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
103 B
|
38ms
38ms
|
XHR
image/gif |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
200
|
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
|
254 B
648 B
|
23ms
23ms
|
Image
image/png |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
UnitFeedManagerDesktop.min.js
Show response
vidstat.taboola.com/lite-unit/1.0.7/
|
22 KB
7 KB
|
21ms
20ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H/1.1
|
200
OK
|
data
lb46.s400.meetrics.net/
|
43 B
308 B
|
26ms
26ms
|
Image
image/gif |
136.243.3.132
HETZNER-AS
|
|
General
- Full URL
- https://lb46.s400.meetrics.net/data?/K06kDdLAAKktFLkqFFlqwF23A52AwwA/k0FMEmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A0zA2wALlnFBUkzF2BPQGAAAAAAAB8hPAPBAAFAA8hPTA5iAPBAAAAAn8ABA5iAZAAAOA55A55A85B55A58E55A55AFA2zA2xAyBErA5iAPAEAAAAn8AHA5iAPAAAAAAjRBKA5iASksFbFjAAAAAAAAAAAAEAAA8hPAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAGAkpFylFj0FAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0fFvmFfwFhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA1AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0fFvmFfwFhnFlBFdAAAn8AxYAAAAFAAAA5iAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFh/vOUA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.132
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h224.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 5912
|
0
0
|
34ms
33ms
|
Fetch
image/gif |
172.217.23.130
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstR_FS4Cm2UGKJKY7DNQH8zGzJjVcVbDZKsfyx_JRp1OUz-Bxq3myAe4ng4xhkn4MdcRLud77G7SQ8M-PwvKMjtxH1RViOtJQOurLbXU3xjsKlV_5s_pdQTaUVUnpfmj1j0z6pRuIHh77EonqQiIqgd87H8Jp-audZO96KB8DFfvdVczgFsvVyrbXJg54zptskD7aQKZ-LaIlb9ERtfjTSqaQ7_jJtq2w_8x4Xu6MaYGFvp4NvGwm-vymAHB0LU-lmzFpcktlrK90kwBkw75w&sig=Cg0ArKJSzHLurNgzjXimEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.130
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s18-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 5912
|
43 KB
14 KB
|
16ms
16ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 5912
|
73 KB
28 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:814::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_2020022701.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 31eef561438773aa8905d73dfe2e8400eca13620146d6235c6e019a828bd33fe
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
5302344717
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
205 B
|
21ms
21ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
pubads_impl_2020022701.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 5912
|
164 KB
60 KB
|
32ms
30ms
|
Script
text/javascript |
172.217.23.130
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame 5912
|
113 B
175 B
|
15ms
14ms
|
Script
application/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
21ms
21ms
|
XHR
text/plain |
35.156.162.45
AMAZON-02
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame 5912
|
19 KB
8 KB
|
352ms
351ms
|
XHR
text/plain |
172.217.23.130
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=992126920691706&correlator=3495823016468722&output=ldjh&impl=fif&eid=21065629%2C21064170%2C21064370%2C21065203%2C21065352&vrg=2020022701&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200305&iu_parts=5286166%2Cgiga.de%2CDFP-Passback-300x600&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=120x600%7C160x600%7C300x600&eri=6&cookie=ID%3Dda3a31fd9dbf9150%3AT%3D1583389044%3AS%3DALNI_Mas8PCcxpp6gZRubu9-Jq7ve6aW-w&cdm=www.giga.de&bc=31&abxe=1&lmt=1583389044&dt=1583389044784&dlt=1583389044701&idt=72&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=600&oid=3&adxs=1318&adys=125&adks=2714360146&ucis=q76b2ijh6odk&ifi=1&ifk=1958905618&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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&top=www.giga.de&dssz=8&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x600&msz=300x600&ga_vid=468571453.1583389044&ga_sid=1583389045&ga_hid=1369463517&fws=256&ohw=0&btvi=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js?21065629
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.130
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s18-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- b09fe67b03c405c2d10656dbdebb20859a59de6a9e5eb803e7c7d578b736c827
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020022701.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 5912
|
69 KB
25 KB
|
32ms
31ms
|
Script
text/javascript |
172.217.23.130
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame 5912
|
0
0
|
10ms
5ms
|
Other
text/html |
2a00:1450:4001:819::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_2020022701.js?21065629
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
DATA
|
200
OK
|
truncated
/
Frame 5912
|
216 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
8275437b-d598-453d-893e-9d7ec31ba65e
Show response
t.nativendo.de/cds/tracking/event/
|
0
179 B
|
39ms
38ms
|
Script
text/javascript |
107.178.241.34
GOOGLE
|
|
|
GET
H2
|
200
|
8275437b-d598-453d-893e-9d7ec31ba65e
Show response
t.nativendo.de/cds/tracking/event/
|
0
181 B
|
36ms
35ms
|
Script
text/javascript |
107.178.241.34
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
data
lb46.s400.meetrics.net/
|
43 B
308 B
|
26ms
26ms
|
Image
image/gif |
136.243.3.132
HETZNER-AS
|
|
General
- Full URL
- https://lb46.s400.meetrics.net/data?/K06kEmNAA/k0FUImvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A0zA2wAmvFytFh0FjvFklF94Et1EurFuvF3uFtzAx4EzxAmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF91AzwAz1AxwA2wAzmAjpFk9BxzA4zAwzA34Ay5Az4AmzEp6Fl9BzxA4zBxmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1zAwzA1xAw2AwzAmhEwkF91AzwAz1AxwA2wAzmAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A02A5zALlnFCUkzFYBPLBAAAAAAABMnGAPAAAFAAMnGTl5/APAAAtGA9BABl5/AZBAAOA55A55A85B55A58E55A55AFAy3Aw4A0BErl5/ASksFSFjAAAAAAAAAAAAEAAAMnGAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFFAzxA4zBxBEMAxzA4zAwzA34Ay5Az4AGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA1zAwzA1xAw2AwzAGAihFuuFlyFKA1zAwzA1xAw2AwzAKA1zAwzA1xAw2AwzAwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFdtGA9BAfAAfAAFAAAl5/AAAAAPA4tB1uFruFv3FutBzxA4zBxBEAAAAAAAAAAAAAAAAQtjF2T2HWA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.132
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h224.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
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 73F9
|
53 B
703 B
|
25ms
25ms
|
XHR
application/json |
52.219.74.159
AMAZON-02
|
|
General
- Full URL
- https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=1556051330
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGJhZXJhZUhpVGhlcmVpbmc9YmFlcmFlSGlUaGVyZWluZ3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnRtKCkse2lkOmF9KX0sNTAwKTtpZihmLnBuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5SbihsKTtiLlFuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLlluKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlFpfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudm4uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnFoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnRqPWE7YS5wcm90b3R5cGU9e3BvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5xaFtiXSYmKHRoaXMucWhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5wbygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sU2s6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LHZuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLnVuKGIuZGF0YSl9LHVuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmgoYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZmg6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sUWs6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5PbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sT2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFlnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxGbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxlaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sJG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLiRuKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0semg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LAp6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPXo7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYSh6KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LHFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCx6PTA7ejxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeisrKSxnPWIuY2hhckNvZGVBdCh6KyspLHE9Yi5jaGFyQ29kZUF0KHorKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxBbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSx6PSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksej0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtSaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxybTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx6azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sSWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxrazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlJpKCl8fGIuWWkoKXx8Yi5ybSgpfHxiLlVqKCl8fGIuemsoKXx8Yi5JaigpfHxiLmtrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0sZ206ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LGhvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LCRnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnBuPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSx3bjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LGlvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMud24oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5GbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5lYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5lYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlFtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LFluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LHltOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnRqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnNqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eua3A9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5vcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuUW89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmNuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5scD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQ2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5nbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuanA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLk5vPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5lbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5zanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkptfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuY20oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy51anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLmdqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuYmo9YX0pKGMpO3ZhciBLPWMuYmp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5PaXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuU24oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LExuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxTbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkRoJiZMLm9vKGEpfSwkcDpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sem06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlpqfHxwOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sYm86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sVW46ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxacDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk1rKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApicTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxlcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFZwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5MaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy5YbT0zMDt0aGlzLmJjPVtdO3RoaXMubmI9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnhpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy5UbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnhpfHwodGhpcy54aT0hMCxmLmtmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxzbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnNtKCk7CmlmKCF0aGlzLndtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMubmIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5uYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm5iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksYT10aGlzLm5iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LFpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxUbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTGl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5OaXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaWp8fG9hOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5NcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmpqfHxwYTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMua2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkRrfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApO3RoaXMuVyhiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Eanx8c2E7KGZ1bmN0aW9uKGMpe2MuQ2o9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy50ZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGU9MDtlPApkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnJlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5YbSYmIXRoaXMueWEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTmQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMudGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5MZT90aGlzLkxlKys6dGhpcy5MZT0xOnRoaXMuS2U/CnRoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Danx8dGE7KGZ1bmN0aW9uKGMpe2MuRWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGU9MDtlPGIubGVuZ3RoO2UrKylhLnB1c2goYltlXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwplLndifHx0aGlzLksoZSl8fHRoaXMuem0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxYcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkxtfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy51az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwkZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGUpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnVrfHx4YTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy53aT0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5ibihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy55YigpKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuUigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9dGhpcy5PYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlJjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlJjfSx4bTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk9jKCksYj10aGlzLnZtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpe3RoaXMuRW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sRW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5SKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuUigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxXcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMueG0oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9jKCksYT10aGlzLlBjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5NPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmCmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZnE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/KHRoaXMudygpLHRoaXMuamEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55YSgpfHwoYXx8KHRoaXMud2k9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMud2ksZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHJsOmZ1bmN0aW9uKCl7dGhpcy5ncXx8KDEwPHRoaXMuV28/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMuV28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5LbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxLbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ybyl7dGhpcy5Ybz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksCjUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB5YT1jLnRrfHx5YTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5oaSh3aW5kb3cpOwpmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmhpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGhpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZGVvanMtcGxheWVyIikpJiZhLnBsYXllciYmYS5wbGF5ZXIucGxheWVyJiYoYT1hLnBsYXllci5wbGF5ZXIoKSxiLnB1c2goYSkpO2lmKDA8Zi5TZShiKSl7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmKGE9bmV3IHhhKGJbZV0pLGEuaGF8fHRoaXMuSyhhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgeWEoYSx0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuWmI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMudmt8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLnRmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5VKCk7CnJldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0scm46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fGIuTmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLnRmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCnVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE1hOmZ1bmN0aW9uKCl7fSwkZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLk9iKyssMTU8dGhpcy5PYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLk9lPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGU9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9CiEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLkJhKCk7CnZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuS2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLktsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Eucm4oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBSKGFbYl0pO2UuaGF8fHRoaXMuSyhlKXx8KHRoaXMuTChlKSwobmV3IENhKGUsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuWGt8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmVoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudG49YS5wb3NpdGlvbmluZzt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnN0eWxlLndpZHRoPWEud2lkdGg7ZS5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2Uuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtlLnN0eWxlLmhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1heEhlaWdodD0KYS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy50bil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTt0aGlzLkNkPWV9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5DZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQ2QpfSxsYTpmdW5jdGlvbigpe3JldHVybiEwfSxxbDpmdW5jdGlvbigpe2YuemgodGhpcy5DZCk7Zi5hZih0aGlzLkNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCmdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5Banx8R2E7KGZ1bmN0aW9uKGMpe2Muemo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhOyhmdW5jdGlvbihjKXtjLkJqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1mLmVoKGEsImVsZW1lbnRJRCIpO2lmKGYuemgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5LKGEpKSl7dGhpcy5MKGEpOyhuZXcgSWEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLkJqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5Wa3x8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnZqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sTms6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy52anx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCwKZyxjKXt0aGlzLkZhPWI7dGhpcy5aZz10aGlzLkZpPSExO3RoaXMuTGg9ZDt0aGlzLmlpPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmtiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbCYmbC5kZih0aGlzLkZhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2cmJjQhPWgucmVhZHlTdGF0ZSYmZyhoKX0uYmluZCh0aGlzKX1jLndqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhLmRhdGE7aWYoInN0cmluZyIhPQp0eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy5aZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5rYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5rYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmtiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuRml8fCh0aGlzLmtiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5rYi5zZW5kKGIpfWNhdGNoKGcpe2I9dGhpcy5GYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8CnRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTGgmJnRoaXMuTGgoKX1yZXR1cm4gdGhpcy5rYn19fSkoYyk7dmFyIE1hPWMud2p8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuY2o9YTthLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYil7dGhpcy5tZT1ifSxXbjpmdW5jdGlvbihiKXt0aGlzLkdhPWJ9LEluOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3ZwOiJBZENsaWNrVGhydSIseHA6IkFkRXJyb3IiLHlwOiJBZFN0b3BwZWQiLEJwOiJBZExpbmVhckNoYW5nZSIsQ3A6IkFkVGFnUGFyc2VkIixGcDoiQWRWaWRlb0NvbXBsZXRlIixJcDoiQWRMb2FkZWQiLApKcDoiQWRTa2lwcGVkIixLcDoiQWRTdGFydGVkIix6cDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEFwOiJBZEltcHJlc3Npb24iLHdwOiJBZENyZWF0aXZlVmlldyIsRHA6IkFkVmlkZW9NaWRwb2ludCIsRXA6IkFkUGF1c2VkIixHcDoiQWRWaWRlb1N0YXJ0IixIcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLm1lLGFbZF0pfSxIbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuR2EmJnRoaXMuR2EubGUpZm9yKHZhciBhIGluIHRoaXMuR2EubGUpdGhpcy5HYS5sZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkdhLHRoaXMuR2EubGVbYV0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuR2EuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwKMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5JbigpO3RoaXMuR2EmJnRoaXMuSG4oKX19fSkoYyk7dmFyIE5hPWMuY2p8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnBiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLm9iPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjt0aGlzLmVmPSExO3RoaXMucWE9dGhpcy5RYz0iIjt0aGlzLiRlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnlmPSExO3RoaXMuaWE9W107dGhpcy5XZT10aGlzLlZiPSIiO3RoaXMuamU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5pZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMubGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuYWM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2I9IiI7dGhpcy5YYj0KW107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmliPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmFiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkhkPTA7dGhpcy5waD0hMTt0aGlzLm9oPTFFMzt0aGlzLkVjPSExO3RoaXMuUGE9MUUzO3RoaXMua2Q9dGhpcy5sZD0iIjt0aGlzLkRiPW51bGw7dGhpcy5HaT0hMTt0aGlzLlljPXRoaXMuUWQ9bnVsbH1jLnhqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkNhLGFkdGFncGFyYW1ldGVyOnRoaXMucGIsYWR0YWdtb2RpZmllcjp0aGlzLm9iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5lYyxhZHRhZ3JlZ2V4OnRoaXMucWQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuZmYsCnNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLHNlcnZlcjp0aGlzLmlhLHN2bUNvbmZpZzp0aGlzLlZiLGhvbWFkQWRwYXRoOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5qZSxIT01BRF9CTE9DS0VEOnRoaXMuaWUsSE9NQURfTk9CTE9DS0VSOnRoaXMubGIsSE9NQURfQURCTE9DS0VSOnRoaXMuYWMsdGVzdEhpZGU6dGhpcy5XYix0ZXN0VGFnczp0aGlzLlhiLHRlc3RUYWdzSlM6dGhpcy5ZYix0ZXN0VGFnc1hIUjp0aGlzLmJkLHRlc3QzUENvb2tpZTp0aGlzLnRjLHRocm90dGxlOnRoaXMuWmQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5uYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmFiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5iYix2cGFpZDp0aGlzLmliLHNraXBBbGxvd2VkOnRoaXMuTGYsdm1hcHM6dGhpcy5hZyxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuRWMsYWRGYWxsYmFja1VSTDp0aGlzLmxkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5rZCx5aWVsZGxhYjp0aGlzLkRifX0sUG46ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMucGI9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYKKHRoaXMub2I9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuZmY9Yi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLnpiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuVGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmVmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLlFjPWIuZ2xvYmFsQ29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuJGU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5pYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlZiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5XZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5qZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJgoodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5sYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYodGhpcy5XYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5YYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlliPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuYmQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnRjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5aZD1iLnRocm90dGxlKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuSGc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMueGM9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5zZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5XZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLmJlPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYWI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmKHRoaXMuYmI9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5pYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5MZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5hZz1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkVjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LG9tOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYWJbYV0mJjE9PXRoaXMuYWJbYV0mJihiPSEwKTtyZXR1cm4gYn0sRWY6ZnVuY3Rpb24oYil7dGhpcy5hYltiXT0hMH0sWWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuYWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5hYlthXSYmMT09dGhpcy5hYlthXSYmYi5wdXNoKGEpO3JldHVybiBifSxYZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9Zi4kayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBnPSIiLGM9IiIsZj0iIixoPSIiO2lmKCF0aGlzLkNhJiYhYSlyZXR1cm4gbmV3IEMoYik7Zz10aGlzLmNmKGIpO2M9dGhpcy5hYShiKTtnPyh0aGlzLlNjKCk/Zj1iOmY9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZj10aGlzLnFjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMucGJ8fHRoaXMub2J8fAp0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5abShoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLiRsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sY2Y6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlNjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LGRmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuY2YoYik7cmV0dXJuIGF9LCRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLlJwOwpyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxIaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGcpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxZbTpmdW5jdGlvbihiLGEpe3ZhciBkPWYuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPApoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5IaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPXRoaXMuSGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Z31sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBnPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxabTpmdW5jdGlvbihiKXt0aGlzLnBiJiYoYis9dGhpcy5wYik7aWYodGhpcy5vYilmb3IodmFyIGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm9iW2FdKSk7aWYoZi5KYylmb3IodmFyIGQ9MDtkPGYuSmMubGVuZ3RoO2QrKyl7dmFyIGc9CmYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuWW0oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmYS5YbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuV24oYi5wbGF5ZXIpO2EuZigpfX0sZzpmdW5jdGlvbihiLGEsZCxnLGMsZil7bD10aGlzO3RoaXMuZWY9ITA7dGhpcy5RYz1iO3RoaXMucWE9YTt0aGlzLnlmPWQ7dGhpcy5lZT1nO3RoaXMuaWM9Yzt0aGlzLnhhPWZ8fHt9O3RoaXMucGwoKTt0aGlzLlBtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnFhKXRoaXMuTm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuR2MoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LENsOmZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQ9ITE7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxQbTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5RYyt0aGlzLnhlKCJnbG9iYWwiKSksdGhpcy5tbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkdjKCl9LmJpbmQodGhpcyksITApfSxObTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5xYSt0aGlzLnhlKCJjbGllbnQiLAotMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuU2IoKSk7dGhpcy54YSYmdGhpcy54YS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YiYmKGQ9IiIpO3RoaXMueGEmJnRoaXMueGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5zZCl7dGhpcy5zZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZSl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0KITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuJGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTt0aGlzLkJiKCk7Zi5MYyhrLnFuKTsoYT1mLlVhKHRoaXMuSWQoKSkpfHwoYT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxtbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZz0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmCihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihhLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnFhfHx0aGlzLlZifHx0aGlzLkFhfHx0aGlzLkdjKCk6KHRoaXMuQ2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5CYigpKX19LEdjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7CnRyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGQuc2VydmVyLmxlbmd0aDthKyspe3ZhciBiPWQuc2VydmVyW2FdO3RyeXt2YXIgZTsoZT12b2lkIDA9PT1iKXx8KGU9IWIucmVwbGFjZSgiW2hhc2hdIix0aGlzLkpmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpKS5tYXRjaChSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSkpO2lmKGUpcmV0dXJuITF9Y2F0Y2goZyl7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9CihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChmLlIoIndlYi5kZSIpfHxmLlIoImdteC5uZXQiKXx8Zi5SKCJnbXguYXQiKXx8Zi5SKCJnbXguY2giKXx8Zi5SKCIxdW5kMS5kZSIpKSYmIXRoaXMuU2MoKSlmb3IoYj0wO2I8dGhpcy5pYS5sZW5ndGg7YisrKXRoaXMuaWFbYl09dGhpcy5pYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8CiExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJnRoaXMuQWEmJnRoaXMuaWEubGVuZ3RoP3RoaXMuVGMoITEpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5sYikpLHRoaXMuQmIoKSl9LGNpOmZ1bmN0aW9uKGEpe3RoaXMubGR8fCh0aGlzLmxkPWF8fCIiKX0sVGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUyl7dmFyIGU9e307aWYoYSl7dmFyIGU9bmV3IEModGhpcy5xYygpKSxkPXRoaXMuYWEodGhpcy5WYik7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtlLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2UubWV0aG9kPSJQT1NUIn1lbHNlIGU9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGUsdGhpcy5yby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTthP3RoaXMuams/dGhpcy5zYSgibm9TVk1Db25maWciKToodGhpcy5qaz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuVGMoITApfS5iaW5kKHRoaXMpLCEwKX19LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBlPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtpZighdGhpcy5uYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubmM9ITA7dGhpcy5UYyghMCk7cmV0dXJufX1lPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZT0hMCl9Y2F0Y2goaCl7fWlmKCEoZXx8CmQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2EucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5XZj10aGlzLkFiKGQuc3RyaWN0KTt0aGlzLmJlPXRoaXMuQWIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuU2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmJiPXRoaXMuQWIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkFiKGQuZW5hYmxlZCk7dGhpcy5XYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlliPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuYmQ9ZC50ZXN0YWR0YWdzeGhyfHwKW107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5wYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLm9iPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5xZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5mZj1kLmpzcG9wdXBzfHwhMTt0aGlzLnpiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLmliPWQudnBhaWR8fCExO3RoaXMueGEudnBhaWQ9dGhpcy5pYjt0aGlzLkxmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMudGQ9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmFnPWQudm1hcHN8fCIiO3RoaXMuRWM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlpkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307dGhpcy5EYj0KZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuQ28oKSYmKHRoaXMuV2J8fHRoaXMuWWJ8fHRoaXMuWGJ8fHRoaXMuYmQpP3RoaXMueWY/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5FZSgpLHRoaXMuQmIoKSk6dGhpcy51bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlRmKCkpfX0sVG06ZnVuY3Rpb24oYSl7dGhpcy5HaT0hMDt2YXIgZT1mdW5jdGlvbihhKXtpZihhPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnwgKSIrYSsiPShbXjtdKykiKSkpcmV0dXJuIGFbMl19KCJhZHBfc2VncyIpfHwiZTAiLGU9dGhpcy5EYi51cmwucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltzZWdzXSIsCmVuY29kZVVSSUNvbXBvbmVudChlKSksZT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6ZSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLnFiKGUpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07Zi5LZCh0aGlzLnFjKCksIlBPU1QiLGUsZnVuY3Rpb24oZSl7dHJ5e3ZhciBnPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe31mLnRyYWNrKCJzdGF0c19oZF95bF9kYXRhIiwhKCFnfHwhZy5sZW5ndGgpLCEwKTt0cnl7aWYoZyYmZy5sZW5ndGgmJnRoaXMuRGIucGFyYW1ldGVyKXt2YXIgaD10aGlzLkRiLnBhcmFtZXRlci5zcGxpdCgiW2lkXSIpLmpvaW4oZ1swXS5pZHx8IjAiKSxoPWguc3BsaXQoIltwcmljZV0iKS5qb2luKGdbMF0ucHJpY2V8fDApO3RoaXMucGIrPWh9fWNhdGNoKEIpe2EoKX1hKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthKCl9LmJpbmQodGhpcyksITApfSx1bzpmdW5jdGlvbigpe3RoaXMudG8oKTt0aGlzLnZvKCl9LAp2bzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGU9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cud2lkdGg9MTtnLmhlaWdodD0xO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1mLlYoMTApLGg9Zi5WKDEwKSxCPWYuVigxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJkYXRhIiwiIil9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShCKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZi5xYihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGcpfWNhdGNoKGEpe31pZigzIT0KZCl7dmFyIGI9Zi5CZCgpO2lmKChiLmlzQ2hyb21lfHxiLmlzRmlyZWZveCkmJiFiLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsZSwhMCk7cmV0dXJufXRoaXMuc2EoImNzcF8iK2UpfWYudHJhY2soInN0YXRzX2hkX2NzcCIsZSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFRmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxZZDpmdW5jdGlvbihhKXt0aGlzLnhjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkNhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYihhKSksdGhpcy5CYigpLHRoaXMuRWUoKSl9LHRvOmZ1bmN0aW9uKCl7aWYodGhpcy5XYil7dmFyIGE9Zi5CZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuQ20oKSl0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTtlLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZD0wPT09ZS5vZmZzZXRXaWR0aHx8MD09PWUub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSk7YT1kfWNhdGNoKGcpe31hP3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMubGkoKX19ZWxzZSB0aGlzLmxpKCl9LFJmOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPQpkLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy55byhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlhiPXRoaXMuYmQpJiZ0aGlzLlhiLmxlbmd0aCl7dmFyIGQ9dGhpcy5YYi5zbGljZSgpLGc9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LHlvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gYygpe3JldHVybiBmPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGYpLCEwKTohMX12YXIgZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0aGlzLkthKG5ldyBDKGEpLGcsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxsaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz0KZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuem8oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuWWImJnRoaXMuWWIubGVuZ3RoKXt2YXIgZD10aGlzLlliLnNsaWNlKCksZzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUmYoKX0sem86ZnVuY3Rpb24oYSxlLGQpe2Z1bmN0aW9uIGcoKXtmKCkmJmUoKX1mdW5jdGlvbiBjKCl7ZigpJiZkKCl9ZnVuY3Rpb24gZigpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZSxkKXtkPT1hJiZmKCkmJgpjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtnKCl9fSxRZjpmdW5jdGlvbigpe2lmKHRoaXMudGMpdHJ5e2YuS2QodGhpcy50YywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5IYj0hdGhpcy5BYihhLmNjKTt0aGlzLlRmKCl9LmJpbmQodGhpcyksdGhpcy5qaS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmppKCl9ZWxzZSB0aGlzLlRmKCl9LGppOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpO3RoaXMuRWUoKX0sQ206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sCkJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMueGMmJihlPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2UsITApO3RoaXMuQ2EmJnRoaXMuaXNFbmFibGVkJiZ0aGlzLlFkJiZ0aGlzLmNsKCk7dGhpcy50YyYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkhiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5qZSkpO3RoaXMuZWUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZSYmdGhpcy5lZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5IYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuWWM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ZYy5pZD1mLlYoMTApO3RoaXMuWWMuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLlljKTt2YXIgYT10aGlzLlljLmNvbnRlbnRXaW5kb3csZT0KYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD1mdW5jdGlvbigpe2Zvcih2YXIgZSxnPTA7Zzx0aGlzLlFkLmxlbmd0aDtnKyspZT1hLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGUudHlwZT0idGV4dC9qYXZhc2NyaXB0IixlLnNyYz10aGlzLlFkW2ddLGEuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX0uYmluZCh0aGlzKTtlLnNyYz1mLkFlKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZSk7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZi50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sb2w6ZnVuY3Rpb24oKXtpZih0aGlzLmJlJiZ0aGlzLm9tKCkpe3ZhciBhPQp0aGlzLllsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZSl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZSxkLGcsYyxoKXt0aGlzLkhkfHwodGhpcy5IZD0wKTt0aGlzLkhkKys7dGhpcy5IZD50aGlzLm9oJiYhdGhpcy5waCYmKHRoaXMucGg9ITAsZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLm9oLCEwKSk7YT1uZXcgTWEoYSxlLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpO2cmJihhLkZpPSEwKTtjJiZmLkFtKCkmJihhLlpnPSEwKTtoJiYKKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLldtfHwodGhpcy5XbT0hMCxmLkRhKCl8fGYuZWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhlPWEucmVzcG9uc2VYTUwpfHwoZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJmcuY2hpbGROb2Rlc1swXT9nLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOgoiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGUpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoZSk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsCmcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LHNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmFnfSxtbDpmdW5jdGlvbigpe3RoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuS2EoYSx0aGlzLlBvLmJpbmQodGhpcyksdGhpcy5Pby5iaW5kKHRoaXMpKX0sClBvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5KbCgpfSxPbzpmdW5jdGlvbigpe30sSmw6ZnVuY3Rpb24oKXtmLkxjKGsuSWwpO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09ZS50eXBlJiZmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09ZS50eXBlKXt2YXIgZD1uZXcgSTt3aW5kb3dbZC5nYSgpXT0KdGhpcztmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LENvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWmR9LFNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGU9IiIsZD0wO2Q8YTtkKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGV9LEFiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0iIixkLGcsYyxmLGgsayxsPTA7bDxhLmxlbmd0aDspZD0KYS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZT1lKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBlfSxhYTpmdW5jdGlvbihhKXt2YXIgZT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtlW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixlKXtiJiYoZC5xdWVyeUtleVtiXT1lKX0pO3JldHVybiBkfSxKZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBlKGEpe3ZhciBiPSIiLGUsZDtmb3IoZT03OzA8PWU7ZS0tKWQ9YT4+PjQqZSYxNSxiKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGcsYyxmPUFycmF5KDgwKSwKaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChnKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKylmW2ddPWQoZltnLTNdXmZbZy04XV5mW2ctMTRdXmZbZy0xNl0sMSk7Yz1oO249aztwPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZwfH5uJnIpK3UrZltnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnB8biZyfHAmcikrdStmW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTYwOzc5Pj1nO2crKyl2PWQoYyw1KSsobl5wXnIpK3UrZltnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLApjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihlKGgpK2UoaykrZShsKStlKG0pK2UodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnhqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLlVrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSxkKXt0aGlzLmE9YTthLmMuUD90aGlzLmdiPWEuYy5QKCk6dGhpcy5nYj0iIjthLmMud2gmJmEuYy53aCh7cGF1c2U6dGhpcy5OZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLiRoLmJpbmQodGhpcyksbXV0ZTp0aGlzLm9mLmJpbmQodGhpcyksCnVubXV0ZTp0aGlzLkpvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEuc2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5qYz10aGlzLnJkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9ZTt0aGlzLmpiPXt9O3RoaXMudmlkZW89e307dGhpcy5WZD17fTtmLnZiKCJuZXdCaWdBZElkIik7dGhpcy5ibD1mLlYoMTApO3RoaXMuTmY9MDt0aGlzLm9kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMub2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMub2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuVGs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5XYz10aGlzLlVkPSExO3RoaXMuRmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy53ZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMub2M9ITE7dGhpcy56bD1mLlYoMTApO3RoaXMuUmI9Zi5WKDEwKTt0aGlzLlBiPWYuVigxMCk7dGhpcy5laT1mLlYoMTApO3RoaXMuY29uZj17fTt0aGlzLmZlPXRoaXMuJGI9dGhpcy5JZT10aGlzLnlkPXRoaXMuV2Q9dGhpcy5DYj10aGlzLnZjPXRoaXMuT2g9dGhpcy5IZT10aGlzLkRkPXRoaXMuRG89dGhpcy5GYj10aGlzLlFiPSExO3RoaXMuQWM9W107dGhpcy5wYz17fTt0aGlzLm1uPTIwMDt0aGlzLmRnPXRoaXMuZGQ9dGhpcy5GYz10aGlzLmNnPXRoaXMueGY9ITE7dGhpcy5xZj17fX1jLnJqPWE7YS5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihlPQp0aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBlfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5OYiYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMua28oKTtmLm8oay5Layx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqZjpmdW5jdGlvbihhLGUsZCxnKXt0aGlzLkZiPWQ7dmFyIGM9ITE7ZyYmZy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGM9ITApO2lmKHRoaXMuQS5TKXRoaXMuTmYrKyxmLnZiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxnPWwuZ2V0Q29uZmlnKCksZi5PZyYmKHRoaXMuQS5Qbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5BLkNhJiZ0aGlzLkEuaXNFbmFibGVkPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCwKa2VlcFVSTDplLGJpdHJhdGU6Zy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5pYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTplPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaWIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpnLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5RYSgpO2Vsc2V7dmFyIGg9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmNvKHRoaXMuYik7dGhpcy5raChhKTt0aGlzLkFjPXRoaXMuYWgoYSk7dGhpcy5zbCgpfSxraDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmltKGIpKSx0aGlzLmtoKGIucGFyZW50KSl9LGFoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5haChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlRsKGIpKSk7cmV0dXJuIGV9LFRsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLmtwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmNuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5IbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMubG8oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Rbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsubHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5vcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLk1vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLk5vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sY286ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuamIuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS5ycT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlRrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk9rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5taShlKSl7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5SayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmpiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuamIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuYW8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sYW86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuU2sodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5QaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMueWkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLmxtKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5abygpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuQ2ksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5jcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaHAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZ3AoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5pcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5lcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5EaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGUpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmFwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LCRvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0sYXA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sYnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LFpvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuZ2koKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxncDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxpcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LERpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LFlvOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsuanAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkRpKCEwKX0sT2s6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBlPWIuYWEoYSk7cmV0dXJuIGUucHJvdG9jb2wrIjovLyIrZS5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLlVvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbWk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFJrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5CaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQWk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm1pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlNvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLlJvKCk7dGhpcy55aSgpO3RoaXMuQmcoKTt0aGlzLmEuUGgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5kaSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuYmImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LExrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZmgoYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5pbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuTGsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5nbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuamIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS52aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlloKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkloKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sVW86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQmk6ZnVuY3Rpb24oKXtpZih0aGlzLkRvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5HbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5DaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmpiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLnZpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxzaTpmdW5jdGlvbigpe3RoaXMuT2h8fCh0aGlzLk9oPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxHbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudGl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnNpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuZ2koKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5iYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy50aT1hKX0sZmk6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxrbzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sZ2k6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LGxvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5iYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5iYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLnltKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGUpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkRsKHRoaXMuYi5PYSxhKX1jYXRjaChCKXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5OayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLlBrKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5YaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxQazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFhoOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sbm86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sam06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxEbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxTbzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy56aS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnppLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sUm86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuJGcoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm5pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Fby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5laTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LG9pOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LEVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sRm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxKbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuSG0oKSYmdGhpcy5HbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLkhvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LEhtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuaWJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5pYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5pYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxHbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sWmw6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LEhvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmlmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7fXRoaXMueGQoKX12YXIgZT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMsZD10aGlzLlpsKCk7dGhpcy5GYz10aGlzLldjPXRoaXMuZGQ9dGhpcy5kZz0hMDtyZXR1cm4gZT8oZi5lYigiaHR0cHM6Ly93d3cud2VsZWN0LmRlL2FwaS92MS9wcmVmbGlnaHQvYnlfYWxpYXMvIitlLCJkZXdlbGVjdHd3d3dlbGVjdGRlIix7fSxhLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpLHRoaXMuQSksITApOiExfSxMZzpmdW5jdGlvbihhKXt0aGlzLm5vKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZyghMCl9LmJpbmQodGhpcyksCnRoaXMubW4pOih0aGlzLldkPSEwLHRoaXMuYS5WZSgpLHRoaXMuYS5NbigpLHRoaXMub2M9ITEsYT10aGlzLmIuc3x8e30sdGhpcy5IZXx8KGEubm9Db21wbGV0ZVF1YXJ0aWxlPSEwKSxmLm8oay55bCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMuUmUoKS5ZaCgpKX0sUmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZi5hZih0aGlzLnZpZGVvLGEpP3RoaXMuJGgoKTp0aGlzLk5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIucmIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuRWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmCihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuQWMmJjA8dGhpcy5BYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuQWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sdTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYmwrIi0iK3RoaXMuTmY7dGhpcy5iJiZ0aGlzLmIuZ2gmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLmdoKCkpO3JldHVybiBhfSxSZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMucmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMucXB8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsZCxjKXt0aGlzLm9wdGlvbnM9Y3x8e307ZT1kO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm9hPW51bGw7dGhpcy5ZPVtdO3RoaXMuSj1udWxsO3RoaXMuemM9dGhpcy5CYz0hMTt0aGlzLmJhPSIiO3RoaXMuYmc9ITE7dGhpcy5yaD0iIjtjJiZjLmVtcHR5P3RoaXMuU20oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxlLGQ9W107Yy5zaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpLGI7Yj1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBlPSIiO2IucXVlcnlLZXkmJihlPWIucXVlcnlLZXkuaHZwKTtlJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBDKHRoaXMudXJsKTpsLnZhKGwuWGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7CnZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52cGFpZCYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfS5iaW5kKHRoaXMpLGM9ZnVuY3Rpb24oKXtyZXR1cm4gZCgpJiYoZi5SKCJtYXJ0aGFzdGV3YXJ0LmNvbSIpfHxmLlIoImZhbmRvbS5jb20iKXx8Zi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKX0uYmluZCh0aGlzKTtpZihkKCl8fGMoKSl7dmFyIGg9Zi5OZyh0aGlzLnVybCk7aHx8KGg9dGhpcy51cmwpO3ZhciBjPWZ1bmN0aW9uKCl7cmV0dXJuIDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4gMDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksbT1mdW5jdGlvbigpe3JldHVybihmLlIoImdpZ2EuZGUiKXx8Zi5SKCJraW5vLmRlIil8fGYuUigic3BpZWxldGlwcHMuZGUiKXx8Zi5SKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbj1mdW5jdGlvbigpe3JldHVybiAwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil8fDA8aC5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfS5iaW5kKHRoaXMpO2lmKGMoKXx8aygpfHxtKCl8fCJhcHBzcG90Ij09ZSluKCk/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5YZChoKSkrIiZ0eXBlPWpzIixiPWwudmEobC5YZCh0aGlzLnVybCksCiExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGYudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPWwudmEobC5YZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLlJtLmJpbmQodGhpcyksdGhpcy5PbS5iaW5kKHRoaXMpKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMub2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmCmEuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09Zi5OYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZVtiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goYyl7ZVtiXT17fX1lbHNlIGUuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZT1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSwKYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWYuTmJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1mLk5ifHx0aGlzLkVtKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLnNvKCkpdHJ5e3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1jLmxlbmd0aCYmKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrY1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1nLmZpcnN0Q2hpbGQ7ZS5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksCmI9MDtiPGEubGVuZ3RoO2IrKyllLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGUpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LEVtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sZT10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrCjYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9ZT8hMDohMX0sUm06ZnVuY3Rpb24oYSl7dGhpcy54bihhKTt0cnl7dGhpcy5vYT1hLnJlc3BvbnNlWE1MLHRoaXMub2F8fCh0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5yaD1hLnVybENhbGxlZDtpZih0aGlzLlkubGVuZ3RoKXRoaXMuVmMoKTtlbHNle3RoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKTt0cnl7Zi50cmFjaygic3RhdHNfaGRfbXR5dXJsIixmLlVhKHRoaXMuYmEpLCEwKX1jYXRjaChlKXt9fX0sU206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMub2F8fAoodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5ZLmxlbmd0aD90aGlzLlZjKCk6dGhpcy5yYSh0aGlzLlJhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5uZTpGLmdnfSkpfSxPbTpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5SYSh2LmZnLHtkZXB0aDpifSkpfSxWYzpmdW5jdGlvbigpe3RoaXMuSj10aGlzLlkuc2hpZnQoKTt0aGlzLkltKCk/dGhpcy5BbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLmxoKCksZSx7QWRTeXN0ZW06dGhpcy5TbCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuUmEodi5pZykpOihiPTAsdGhpcy5LbygpJiZ0aGlzLnVmKHRoaXMuQmwoKSkpfSxwZjpmdW5jdGlvbigpe3RoaXMuQmM/KHRoaXMuQmM9MTx0aGlzLlkubGVuZ3RoLAp0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LnBmKCl9LEloOmZ1bmN0aW9uKCl7dGhpcy56Yz8odGhpcy56Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5JaCgpfSxLbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhvKCk/dGhpcy53bygpPyEwOigtMSE9dGhpcy5OYygpP3RoaXMucmEodGhpcy5SYSh2LmhlKSk6dGhpcy5yYSh0aGlzLlJhKHYuZWcpKSwhMSk6KHRoaXMucmEodGhpcy5SYSh2LmZkLEYuaGcpKSwhMSl9LHVmOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmdlfHwoYS5nZT1bXSk7YS5nZS5wdXNoKHRoaXMucmgpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5sZigpKTthLkViPWEuRWI/YS5FYjp0aGlzLkJjO2EueWM9YS55Yz9hLnljOnRoaXMuemM7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT8KYS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzt0aGlzLnBhcmVudC51ZihhKX0sQmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZHVyYXRpb249dGhpcy5OYygpO2EuTj10aGlzLmloKCk7YS5yYj10aGlzLlVsKCk7YS55cT1bXTthLm9yaWdpbj10aGlzO2Eucz10aGlzLlJsKCk7YS5NZj10aGlzLmhtKGEuZHVyYXRpb24pO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztyZXR1cm4gYX0scmE6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPQphLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7aWYoIXRoaXMuSiYmdGhpcy5vYSYmdGhpcy5vYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLm9hO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGU9ITE7KGU9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZS5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuT2E9YS5lcnJvci5jb2RlIT12LmhlLmNvZGU/YS5PYS5jb25jYXQodGhpcy5WbCgpKTphLk9hLmNvbmNhdCh0aGlzLmRtKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQua2MmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5rYyYmdGhpcy5wYXJlbnQua2MoYSksYj0wLHRoaXMuVmMoKSk6KHRoaXMucGFyZW50JiYKdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sa2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQua2MoYSl9LFVnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLlJhKGEsYikpfSxSYTpmdW5jdGlvbihhLGIpe3ZhciBlPW5ldyBUYShhLGIpO2Uub3JpZ2luPXRoaXM7cmV0dXJuIGV9LEFvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmloKCkubGVuZ3RofSx3bzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuTmMoKX0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxraTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuU2YoKSYmCihhPSEwKTtyZXR1cm4gYX0seG46ZnVuY3Rpb24oYSl7dGhpcy5iYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLmJhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuYmE9IlVOS05PV04ifXRyeXt0aGlzLmJnPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGUpe319LEltOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5saCgpLmxlbmd0aH0sbGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSxTbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBkPWFbZV07W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7dHJ5e2lmKCJUcmFja2luZyI9PWQmJmEmJmEucGFyZW50Tm9kZSYmIlRyYWNraW5nRXZlbnRzIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lJiYoYS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJOb25MaW5lYXJBZHMiPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZXx8YS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJDb21wYW5pb24iPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpcmV0dXJufWNhdGNoKGUpe31pZihhJiYhdGhpcy55aChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy50YihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LHloOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT0KYS5ub2RlTmFtZT8hMDp0aGlzLnloKGEucGFyZW50Tm9kZSk6ITF9LGRtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxVbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxpaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKWIucHVzaCh7aWQ6YVtlXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2VdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbZV0uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtlXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksCmhlaWdodDphW2VdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksU3A6YVtlXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMudGIoYVtlXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUGF8fDFFMzt0cnl7dmFyIGM9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlBhKS1NYXRoLmFicyhkLWIuUGEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWMuY29uY2F0KGYpfWNhdGNoKGgpe31yZXR1cm4gYn0sUmw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGU9ITEsZD1bXSxiPSExLGM9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Yz1iPXRoaXMuR2QoYVtoXSk7dHJ5e2U9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtlPWJ9ZC5wdXNoKGUpO2YucHVzaChjKX0xPGEubGVuZ3RoPyhiPWQsaD1jKTooYj1lLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMudGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxobTpmdW5jdGlvbihhKXt2YXIgYj0hMSxlPSExLGQ9ITE7dHJ5e2U9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWUuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1mLmhvKGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGMpe2I9ITF9cmV0dXJuIGJ9LFFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy50YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sVGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuR2QoYSk6IiJ9LEdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuVGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLnNrfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuUGx8fFVhO25ldyBVYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTj1bXTt0aGlzLnJiPSIiO3RoaXMucz10aGlzLnljPXRoaXMuRWI9ITE7dGhpcy5YZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuWWU9IiJ9Yy5Zaj1hO2EucHJvdG90eXBlPXt2bDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk4ubGVuZ3RoO2UrKylpZigwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxibTpmdW5jdGlvbigpe2lmKCF0aGlzLlhlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ub2Epe3ZhciBhPXRoaXMub3JpZ2luLm9hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxlPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKykoZT1hW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWUuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuWGU9YVtkXSl9cmV0dXJuIHRoaXMuWGV9LApnaDpmdW5jdGlvbigpe2lmKHRoaXMuWWUpcmV0dXJuIHRoaXMuWWU7dmFyIGE9IiI7KGE9dGhpcy5ibSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuWWU9YX0sbG06ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk5bZV07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLllqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLmFsfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt2YXIgdj17b2U6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsTmE6IlhNTF9QQVJTRV9FUlJPUiJ9LGVnOnt0eXBlOiJlcnJvciIsY29kZToyMDIsCm1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTmE6IkRVUkFUSU9OX0VSUk9SIn0sZmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE5hOiJFTVBUWV9WQVNUIn0saWc6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTmE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LGZnOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApOYToiTE9BRF9FUlJPUiJ9LGtlOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixOYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LHNwOnt0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE5hOiJNRURJQUZJTEVfRVJST1IifSxoZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixOYToiRFVNTVlfQUQifX0sRj17Z2c6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixOYToiTk9fQURTIn0saGc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE5hOiJOT19NRURJQUZJTEVTIn0sdHA6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE5hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sbmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTmE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2E9Yy5HbHx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmVycm9yPWE7dGhpcy5BZD1lO3RoaXMuT2E9W107dGhpcy5vcmlnaW49bnVsbH1jLmhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5oanx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWGE9CmMubGt8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5aaD1hO3RoaXMudmlkZW89ZTt0aGlzLmNlPVtdO3RoaXMuV2g9W107dGhpcy5yZj1bXTt0aGlzLlRvPSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5JKCl9Yy51cD1hO2EucHJvdG90eXBlPXtJOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLlpoLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuWmhbYV0sZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCwKYz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7dmFyIGg9Zi5jb250ZW50V2luZG93O2gubnE9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuSm4uYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuQ24uYmluZCh0aGlzKX07dmFyIGs9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7ay5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Euc3JjPWQ7aC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2guZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTsKdGhpcy5jZS5wdXNoKHtzcmM6ZCxmcmFtZTpmLG5uOmMsdmVuZG9yOmUuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLnJmLmxlbmd0aDtlKyspe3ZhciBkPXRoaXMucmZbZV07ZC50eXBlPT09YSYmZC5mbCh0aGlzLldsKGEpKX19LFdsOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e3dxOiEwLHZxOjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e2txOiJ2aWRlbyIsenE6ImpzQ3VzdG9tIixBcToiMS4wLjAtZGV2In19O2Nhc2UgInN0YXJ0IjpyZXR1cm57dHlwZToic3RhcnQiLGRhdGE6e2R1cmF0aW9uOjEwLEJxOjEsVHA6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIiwKZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sa206ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLmNlLmxlbmd0aDtlKyspaWYodGhpcy5jZVtlXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLmNlW2VdLm5uO3JldHVybiIifSxKbjpmdW5jdGlvbihhLGUpe3RoaXMuV2gucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMua20oZSksdmVuZG9yOmV9KTt0aGlzLmpvKCl9LENuOmZ1bmN0aW9uKGEsZSl7InZpZGVvIj09PWE/dGhpcy5Uby5tYXAoZnVuY3Rpb24oYSl7dGhpcy56ZyhhLGUpfS5iaW5kKHRoaXMpKTp0aGlzLnpnKGEsZSl9LHpnOmZ1bmN0aW9uKGEsZSl7dGhpcy5yZi5wdXNoKHt0eXBlOmEsCmZsOmUsdHE6ITF9KX0sam86ZnVuY3Rpb24oKXt0aGlzLldoLm1hcChmdW5jdGlvbihhKXthLkJtfHwoYS5tcSh7YWRTZXNzaW9uSWQ6Zi5WKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS54cSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuQm09ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmpuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWE9Yy5qbnx8WWE7bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmNvbmY9ZXx8e307dGhpcy5jPWE7dGhpcy5zYj1hLmRoKCk7dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSC5pZD0KZi5WKDEwKTt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5IYT17fTt0aGlzLkFnPSExO3RoaXMuZmM9W119Yy5laj1hO2EucHJvdG90eXBlPXtRbDpmdW5jdGlvbihhKXt2YXIgZT17fSxkPSExLGM9MCxlPTAsZj17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPSJmaXhlZCIsYz1lLmxlZnQsZT1lLnRvcCk7Zj17eDpjLHk6ZX07Zi5wb3NpdGlvbj1kO3JldHVybiBmfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlFsKGEpO2Zvcih2YXIgZT0wLGQ9MCxjPSExLGY9dGhpcy5xbShhKSxoPXt9O2E7KWUrPWEub2Zmc2V0TGVmdCsKYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZiYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxlKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxkKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihjPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmUseTpkfTtjJiYoaC5wb3NpdGlvbj1jKTtyZXR1cm4gaH0scW86ZnVuY3Rpb24oKXt0aGlzLkFnPSEwfSx2aTpmdW5jdGlvbigpe3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwKIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5jLmwoKSl9LE1uOmZ1bmN0aW9uKCl7dGhpcy5BZ3x8KHRoaXMuYy5wbGF5KCksZi5vKGsud2QsdGhpcy5jLmwoKSkpfSxLZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5jLnBhdXNlKCk7dGhpcy5ILnN0eWxlLnpJbmRleD1hO3RoaXMuSC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkguc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSC5zdHlsZS5ib3hTaXppbmc9dGhpcy5zYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuc2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkIuc3R5bGUud2lkdGg9dGhpcy5zYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLnNiKTt0aGlzLmMuWmMmJnRoaXMuYy5aYygpP3RoaXMuYy5kaCgpLmFwcGVuZENoaWxkKHRoaXMuSCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkgpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5jLmV4aXRGdWxsc2NyZWVuKCl9LHFtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8ZSYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPQohMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sTmw6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5nZXRQb3NpdGlvbihhKTtlLnBvc2l0aW9uP2UucG9zaXRpb249ZS5wb3NpdGlvbjplLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZS53aWR0aD1hLm9mZnNldFdpZHRoO2UuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBlfSxtYzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLk5sKHRoaXMuc2IpO2lmKGUueCE9dGhpcy5IYS54fHxlLnkhPXRoaXMuSGEueXx8ZS5wb3NpdGlvbiE9dGhpcy5IYS5wb3NpdGlvbnx8ZS53aWR0aCE9dGhpcy5IYS53aWR0aHx8ZS5oZWlnaHQhPXRoaXMuSGEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuSGEud2lkdGgmJjA8dGhpcy5IYS5oZWlnaHQmJjA9PWUud2lkdGgmJjA9PWUuaGVpZ2h0KXt0aGlzLlZlKCk7cmV0dXJufXRoaXMuSGE9ZTt0aGlzLmMuWmMoKT8odGhpcy5ILnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5ILnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSC5zdHlsZS5sZWZ0PQplLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWUueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZS5wb3NpdGlvbjt0aGlzLkIuc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5mYy5sZW5ndGg7YSsrKXRoaXMuZmNbYV0oe3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSl9Zi5QZih0aGlzLkgpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSx5ZzpmdW5jdGlvbihhKXt0aGlzLmZjfHwodGhpcy5mYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuZmMucHVzaChhKX0sVmU6ZnVuY3Rpb24oKXt0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTsKdGhpcy5CJiZ0aGlzLkIucGF1c2UmJnRoaXMuQi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuZWp8fFphLEQ9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWYuVigxMCk7TS5jb250cm9scz0hMDtELnB1c2goTSl9dmFyIEo9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYj1jLmFufHxhYjtuZXcgYWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwoYT10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3RoaXMuVChiKTt0aGlzLlJkKGEpO3RoaXMuUGcoKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZHx8KHRoaXMuaWQ9YSl9LFBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5UYSgpLGI9dGhpcy52aWRlb1RhZztifHwoKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiZhLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wYXJhbWV0ZXJzJiYhMT09PWEucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxlPXRoaXMuVGEoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7YS5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYX19KX0pKGMpOwp2YXIgYmI9Yy5Tanx8YmI7KGZ1bmN0aW9uKGMpe2MuUmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5kYz10aGlzLmRjfHwhMTt0aGlzLnFnPXRoaXMuc2c9dGhpcy52aD10aGlzLnphPXRoaXMuVWY9ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5MbChhLGIpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52aCYmdGhpcy5HZygpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLk1iO2EmJmEub2MmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudWQoKTt0aGlzLnZoPSEwO3RoaXMuR2coKX0uYmluZCh0aGlzKSk7dGhpcy5EZygpfSxHZzpmdW5jdGlvbigpe2lmKCF0aGlzLmRjKXt0aGlzLnVkKCk7aWYoIXRoaXMuVWYmJiF0aGlzLnVkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5VZiYmdGhpcy5xZyYmIXRoaXMuc2cmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSx1ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYSYmYS5hZE1hbmFnZXJzJiZhLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0samg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmU9MDtlPGIubW9kdWxlcy5sZW5ndGg7ZSsrKXt2YXIgYz1iLm1vZHVsZXNbZV07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LERnOmZ1bmN0aW9uKCl7aWYodGhpcy51ZCgpKXt2YXIgYT10aGlzLmpoKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuc2c9MDxhLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5xZz1hLlFwfXRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzQWRQbGF5aW5nP2EuaXEoKTohMX0sTmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QWREdXJhdGlvbj9hLk5jKCk6LTF9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzUGxheWluZyYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxMbDpmdW5jdGlvbihhLGIpe3RoaXMuZGM9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5kY3x8MzAyPT10aGlzLmRjP3RoaXMuemE9ITA6dGhpcy5tKCJhZGVycm9yIix0aGlzLmRjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfSx2ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT8odGhpcy53KCksdGhpcy5qYSgpKTphLlplKCk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuZW0oYSk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIGNiPWMuUmp8fGNiOyhmdW5jdGlvbihjKXtjLlRqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sRG06ZnVuY3Rpb24oKXt3aW5kb3cuT08uY2suR2suRWs/d2luZG93Lk9PLmNrLkdrLkVrLk9wKGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRtKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZhPTE1MDA7dmFyIGE9ZGEoKTtpZihhJiZhLl9faW50ZXJuYWwmJmEuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGYuU2UoYS5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYiBpbiBhLl9faW50ZXJuYWwucGxheWVycylpZihhLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGU9bmV3IGJiKGEuX19pbnRlcm5hbC5wbGF5ZXJzW2JdKTt0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBjYihlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgZGI9Yy5Uanx8ZGIsZWI9bmV3IGRiKHQpO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmxufHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5XaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLmhhPSExO3RoaXMubWgoKX0sbWg6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2F8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpOwphJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1oKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuU2goKX0sU2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYT90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2goKX0uYmluZCh0aGlzKSwKMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5XaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuVmk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sRGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5jb2RlLGU9YS5tZXNzYWdlO2EuZGF0YSYmKGI9YS5kYXRhLmNvZGUsZT1hLmRhdGEubWVzc2FnZSk7MTIwNSE9YiYmKDkwMD09YiYmMDxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKSk6MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/dGhpcy5qYSgpOnRoaXMuaSgpKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHMpO2EucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLkRlKGEpfS5iaW5kKHRoaXMpKTsKYS5wbGF5ZXIub24oInBsYXlpbmciLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRlKGEuYWRFcnJvckV2ZW50cyl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuVml8fGhiOyhmdW5jdGlvbihjKXtjLlhpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLlJkKE1hdGguY2VpbCgxRTEwKgpNYXRoLnJhbmRvbSgpKSksdGhpcy5MKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5VaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pO3RoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliLFQ9bmV3IGliKHQpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuYmt8fApqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubmt8fFU7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5uZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5obihhKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKdy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0saG46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZTtmb3IoZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkpe2I9aXNOYU4oYVtlXSk/ITE6YVtlXTtpZigxMDA5PT1hW2VdfHwxMDAxPT1hW2VdfHwzMDM9PWFbZV18fDQwMz09YVtlXSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGMgaW4gYVtlXSlpZihhW2VdLmhhc093blByb3BlcnR5KGMpJiYoYj1pc05hTihhW2VdW2NdKT8hMTphW2VdW2NdLDEwMDk9PWFbZV1bY118fDEwMDE9PWFbZV1bY118fDMwMz09YVtlXVtjXXx8NDAzPT1hW2VdW2NdKSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMubWt8fFY7KGZ1bmN0aW9uKGMpe2Mub2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLk1kJiYoYT1mLkVsKGEsdGhpcy5NZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTChkKTt2YXIgZz1uZXcgVihkLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuTWR8fAoodGhpcy5NZD1bXSksdGhpcy5NZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5LKGQpfHwodGhpcy5MKGQpLGc9bmV3IFYoZCx0aGlzLkYpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLk8oKX0sbmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwodGhpcy5jYVthXT17fSk7dGhpcy5jYVthXVtiXXx8KHRoaXMuY2FbYV1bYl09W10pO3RoaXMuY2FbYV1bYl0ucHVzaChjKX0sQm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYl0pdGhpcy5VY3x8KHRoaXMuVWM9W10pLHRoaXMuVWMucHVzaChhKSx0aGlzLkxuKCkmJih0aGlzLkFmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYl1bY10mJjA8dGhpcy5jYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPQowO2Q8dGhpcy5jYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuY2FbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9YS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ3LkJvKGEpfX0pfSkoYyk7dmFyIGtiPWMub2t8fGtiLHc9bmV3IGtiKHQpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5tcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMubXB8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sCnVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5TaXx8bWI7KGZ1bmN0aW9uKGMpe2MuVGk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2YuSmMucHVzaCh7Ilt3aWR0aF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRXaWR0aH0pO2YuSmMucHVzaCh7IltoZWlnaHRdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0SGVpZ2h0fSk7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkOwphLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5UaXx8bmI7KGZ1bmN0aW9uKGMpe2MuVWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZCk7dGhpcy5LKGgpfHwodGhpcy5MKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5MYSlpZihiPT10aGlzLkxhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5VaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMubnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLm5wfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Paj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy50bHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudWwoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSWcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz0KYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsaD1hLnNvdXJjZS5DSE9PU0VSX1RJTUV8fCIiO2YudHJhY2soInN0YXRzX2Nob29zZXJfYWIiLGMsITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfaW50ZXJhY3Rpb24iLGMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLklnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuQm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy5oYz1bXSk7dGhpcy5oYy5wdXNoKGEpfSx1bDpmdW5jdGlvbigpe2lmKHRoaXMuaGMmJnRoaXMuaGMubGVuZ3RoKWZvcih2YXIgYT0KMDthPHRoaXMuaGMubGVuZ3RoO2ErKyl0cnl7dGhpcy5oY1thXSgpfWNhdGNoKGIpe319LEZkOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylyZXR1cm4gdGhpcy5LYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEJuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuT2p8fHJiOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpO3RoaXMuRWk9ITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMuRWkmJih0aGlzLmkoKSx0aGlzLkVpPSEwLHRoaXMubmEoKSk7Yi5UYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSmV8fCh0aGlzLkplPTEpLHRoaXMuSmUrKywxMDA8dGhpcy5KZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTmp8fHNiOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT0KYSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHJiKGFbZF0pLHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLlBqfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlBpfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmI7KGZ1bmN0aW9uKGMpe2Mud2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LHpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuem4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuQ2Mpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtCjE7YisrKTEwMDkhPXRoaXMuaGJbYl0mJjMwMyE9dGhpcy5oYltiXSYmNDAzIT10aGlzLmhiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy53a3x8d2I7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuSyhjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IHdiKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciB4Yj1jLnlrfHwKeGIseWI9bmV3IHhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMuTWp8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnZmPSExfSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zbigpfS5iaW5kKHRoaXMpLDUwMCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLApiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnZmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnZmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmCmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LG1vOmZ1bmN0aW9uKCl7dGhpcy52Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuaGt8fEFiOyhmdW5jdGlvbihjKXtjLmdrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5WbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudWN8fCh0aGlzLnVjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLnVjfHx0aGlzLnVjKyssdGhpcy51Yzw9dGhpcy5WbT8odGhpcy51YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuZ2t8fEJiOyhmdW5jdGlvbihjKXtjLmlrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuaWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLlFqfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5laz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5la3x8RmI7KGZ1bmN0aW9uKGMpe2MuZGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVGEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLndsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5NbSgpOnRoaXMuRmcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSx3bDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkliKCk7IWEucGEmJmEuWSYmYS5OcCYmYS5QcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEZnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCl9LmJpbmQodGhpcyksMTAwKX0sSWI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5JYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5UYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sanE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSWIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuZGt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbmw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTChhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLm5sKGFbYl0pO3RoaXMuTygpfX0pO2MuZ2QuSWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy5wcHx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuS2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0saHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sWmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVGE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLktqfHxYOyhmdW5jdGlvbihjKXtjLkpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLndmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMud2Y9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy53ZiYmYyE9dGhpcy53Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLlIoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLm9xKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmp8fFk7KGZ1bmN0aW9uKGMpe2MuTGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLkFmKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMuTGp8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5Wb3x8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5wanx8TmI7KGZ1bmN0aW9uKGMpe2Mub2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTT10aGlzLk18fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxDZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkNlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLm9qfHxPYjsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTmIoYVtiXSk7Yy5oYXx8dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgT2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFBiPWMucWp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmZrfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT8oYz1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuWml8fFNiOyhmdW5jdGlvbihjKXtjLiRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy4kaXx8VGI7KGZ1bmN0aW9uKGMpe2MuYWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGM9bmV3IFNiKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSx3aW5kb3cuYnJpZHBsYXllcj1jLChuZXcgVGIoYyx0aGlzLkYpKS5mKCkpfX10aGlzLk8oKX19KX0pKGMpO3ZhciBVYj1jLmFqfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMuV2t8fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSxhZTpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LEFuOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuQmt8fFhiOyhmdW5jdGlvbihjKXtjLkFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0sZ2M6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkhrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuSGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmdjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuRG4oKX0sRG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55bj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy55bj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmdjKGEpKX19KX0pKGMpO3ZhciBZYj1jLkFrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhLkFuKCksYT1uZXcgWWIoYSx0aGlzLkYpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFpiPWMuQ2t8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5rbnx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy4kbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLiRkKGEpfS5iaW5kKHRoaXMpKX0sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5xa3x8TjsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuT2UpaWYodGhpcy5PYnx8Cih0aGlzLk9iPTApLHRoaXMuT2IrKywxNTx0aGlzLk9iKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLlpuKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5NKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5NPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMucGt8fE87KGZ1bmN0aW9uKGMpe2Mucms9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuQWYoKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBiYz1jLnJrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5GbHx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Hanx8WjsoZnVuY3Rpb24oYyl7Yy5Gaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuTT10aGlzLk18fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuU2IoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy55YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx5YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTT1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRmp8fGFhOyhmdW5jdGlvbihjKXtjLkhqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuSGp8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLklvfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLm1qfHxoYzsoZnVuY3Rpb24oYyl7Yy5saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5FZygpfSxFZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMubGp8fAppYzsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLkwoYSk7KG5ldyBpYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGpjPWMubmp8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLnJwfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLklpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5CZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnphPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5CZS5iaW5kKHRoaXMpLDEwMCl9LEJlOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5IaXx8bmM7KGZ1bmN0aW9uKGMpe2MuSmk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxTYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBuYyhhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgb2M9Yy5KaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuTWl8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5PZD1bXTt0aGlzLnpmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy4kaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmZtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnpmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy56ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5PZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxmbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy56ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxvbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5PZC5sZW5ndGg7YSsrKXRoaXMuT2RbYV0uWmImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZFthXS5aYil9fX0pKGMpO3ZhciByYz0KYy4kanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkttPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy5LbXx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGsuTG8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGsuZW4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTmUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5kanx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLkxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi52YigibmV3QWRkZWxpdmVyeSIpfWMuS2k9YTthLnByb3RvdHlwZT17Vm46ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApSbjpmdW5jdGlvbihhKXt0aGlzLkxiPWF9LFFuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LCRjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnVtKCkpdGhpcy5MYi5nKHRoaXMuTGIuUWMsdGhpcy5MYi5xYSx0aGlzLkxiLnlmLGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTGIuaWMpO2Vsc2UgaWYobC5EYiYmIWwuR2kpbC5UbShmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhrLkhjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5xbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTGIsaCk7bS5Obih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmdmJiYoZD10aGlzLnBsYXllci5nZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5qZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx1bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LGZvOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuJGMoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX0sZW86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRmYoInBvc3Ryb2xsIik7Zi52YigicG9zdHJvbGwiKTt0aGlzLlZuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLiRjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxHbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmJvKHRoaXMuZW8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sVGQ6ZnVuY3Rpb24oYSl7Zi52YigibWlkcm9sbCIpO2YuRmYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy4kYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxGbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLlVuKHRoaXMuVGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubWYoKX0sZjpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLnBsYXllci5tZiYmdGhpcy5GbigpO3RoaXMuR24oKX19fSkoYyk7dmFyIGZhPWMuS2l8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy55anx8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGJhZXJhZUhpVGhlcmVpbmcsYmFlcmFlSGlUaGVyZWluZyk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.219.74.159
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 73F9
|
265 B
436 B
|
27ms
26ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
General
- Full URL
- https://videos.giga.de/homad/giga-ssl.json?cache=7446737492
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGJhZXJhZUhpVGhlcmVpbmc9YmFlcmFlSGlUaGVyZWluZ3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnRtKCkse2lkOmF9KX0sNTAwKTtpZihmLnBuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5SbihsKTtiLlFuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLlluKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlFpfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudm4uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnFoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnRqPWE7YS5wcm90b3R5cGU9e3BvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5xaFtiXSYmKHRoaXMucWhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5wbygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sU2s6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LHZuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLnVuKGIuZGF0YSl9LHVuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmgoYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZmg6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sUWs6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5PbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sT2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFlnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxGbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxlaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sJG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLiRuKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0semg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LAp6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPXo7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYSh6KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LHFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCx6PTA7ejxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeisrKSxnPWIuY2hhckNvZGVBdCh6KyspLHE9Yi5jaGFyQ29kZUF0KHorKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxBbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSx6PSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksej0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtSaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxybTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx6azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sSWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxrazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlJpKCl8fGIuWWkoKXx8Yi5ybSgpfHxiLlVqKCl8fGIuemsoKXx8Yi5JaigpfHxiLmtrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0sZ206ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LGhvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LCRnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnBuPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSx3bjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LGlvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMud24oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5GbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5lYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5lYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlFtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LFluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LHltOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnRqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnNqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eua3A9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5vcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuUW89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmNuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5scD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQ2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5nbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuanA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLk5vPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5lbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5zanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkptfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuY20oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy51anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLmdqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuYmo9YX0pKGMpO3ZhciBLPWMuYmp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5PaXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuU24oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LExuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxTbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkRoJiZMLm9vKGEpfSwkcDpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sem06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlpqfHxwOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sYm86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sVW46ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxacDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk1rKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApicTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxlcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFZwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5MaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy5YbT0zMDt0aGlzLmJjPVtdO3RoaXMubmI9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnhpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy5UbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnhpfHwodGhpcy54aT0hMCxmLmtmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxzbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnNtKCk7CmlmKCF0aGlzLndtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMubmIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5uYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm5iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksYT10aGlzLm5iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LFpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxUbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTGl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5OaXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaWp8fG9hOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5NcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmpqfHxwYTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMua2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkRrfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApO3RoaXMuVyhiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Eanx8c2E7KGZ1bmN0aW9uKGMpe2MuQ2o9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy50ZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGU9MDtlPApkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnJlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5YbSYmIXRoaXMueWEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTmQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMudGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5MZT90aGlzLkxlKys6dGhpcy5MZT0xOnRoaXMuS2U/CnRoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Danx8dGE7KGZ1bmN0aW9uKGMpe2MuRWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGU9MDtlPGIubGVuZ3RoO2UrKylhLnB1c2goYltlXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwplLndifHx0aGlzLksoZSl8fHRoaXMuem0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxYcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkxtfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy51az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwkZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGUpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnVrfHx4YTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy53aT0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5ibihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy55YigpKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuUigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9dGhpcy5PYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlJjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlJjfSx4bTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk9jKCksYj10aGlzLnZtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpe3RoaXMuRW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sRW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5SKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuUigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxXcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMueG0oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9jKCksYT10aGlzLlBjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5NPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmCmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZnE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/KHRoaXMudygpLHRoaXMuamEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55YSgpfHwoYXx8KHRoaXMud2k9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMud2ksZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHJsOmZ1bmN0aW9uKCl7dGhpcy5ncXx8KDEwPHRoaXMuV28/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMuV28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5LbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxLbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ybyl7dGhpcy5Ybz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksCjUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB5YT1jLnRrfHx5YTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5oaSh3aW5kb3cpOwpmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmhpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGhpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZGVvanMtcGxheWVyIikpJiZhLnBsYXllciYmYS5wbGF5ZXIucGxheWVyJiYoYT1hLnBsYXllci5wbGF5ZXIoKSxiLnB1c2goYSkpO2lmKDA8Zi5TZShiKSl7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmKGE9bmV3IHhhKGJbZV0pLGEuaGF8fHRoaXMuSyhhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgeWEoYSx0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuWmI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMudmt8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLnRmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5VKCk7CnJldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0scm46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fGIuTmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLnRmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCnVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE1hOmZ1bmN0aW9uKCl7fSwkZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLk9iKyssMTU8dGhpcy5PYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLk9lPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGU9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9CiEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLkJhKCk7CnZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuS2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLktsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Eucm4oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBSKGFbYl0pO2UuaGF8fHRoaXMuSyhlKXx8KHRoaXMuTChlKSwobmV3IENhKGUsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuWGt8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmVoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudG49YS5wb3NpdGlvbmluZzt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnN0eWxlLndpZHRoPWEud2lkdGg7ZS5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2Uuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtlLnN0eWxlLmhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1heEhlaWdodD0KYS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy50bil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTt0aGlzLkNkPWV9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5DZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQ2QpfSxsYTpmdW5jdGlvbigpe3JldHVybiEwfSxxbDpmdW5jdGlvbigpe2YuemgodGhpcy5DZCk7Zi5hZih0aGlzLkNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCmdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5Banx8R2E7KGZ1bmN0aW9uKGMpe2Muemo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhOyhmdW5jdGlvbihjKXtjLkJqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1mLmVoKGEsImVsZW1lbnRJRCIpO2lmKGYuemgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5LKGEpKSl7dGhpcy5MKGEpOyhuZXcgSWEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLkJqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5Wa3x8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnZqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sTms6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy52anx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCwKZyxjKXt0aGlzLkZhPWI7dGhpcy5aZz10aGlzLkZpPSExO3RoaXMuTGg9ZDt0aGlzLmlpPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmtiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbCYmbC5kZih0aGlzLkZhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2cmJjQhPWgucmVhZHlTdGF0ZSYmZyhoKX0uYmluZCh0aGlzKX1jLndqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhLmRhdGE7aWYoInN0cmluZyIhPQp0eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy5aZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5rYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5rYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmtiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuRml8fCh0aGlzLmtiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5rYi5zZW5kKGIpfWNhdGNoKGcpe2I9dGhpcy5GYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8CnRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTGgmJnRoaXMuTGgoKX1yZXR1cm4gdGhpcy5rYn19fSkoYyk7dmFyIE1hPWMud2p8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuY2o9YTthLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYil7dGhpcy5tZT1ifSxXbjpmdW5jdGlvbihiKXt0aGlzLkdhPWJ9LEluOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3ZwOiJBZENsaWNrVGhydSIseHA6IkFkRXJyb3IiLHlwOiJBZFN0b3BwZWQiLEJwOiJBZExpbmVhckNoYW5nZSIsQ3A6IkFkVGFnUGFyc2VkIixGcDoiQWRWaWRlb0NvbXBsZXRlIixJcDoiQWRMb2FkZWQiLApKcDoiQWRTa2lwcGVkIixLcDoiQWRTdGFydGVkIix6cDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEFwOiJBZEltcHJlc3Npb24iLHdwOiJBZENyZWF0aXZlVmlldyIsRHA6IkFkVmlkZW9NaWRwb2ludCIsRXA6IkFkUGF1c2VkIixHcDoiQWRWaWRlb1N0YXJ0IixIcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLm1lLGFbZF0pfSxIbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuR2EmJnRoaXMuR2EubGUpZm9yKHZhciBhIGluIHRoaXMuR2EubGUpdGhpcy5HYS5sZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkdhLHRoaXMuR2EubGVbYV0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuR2EuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwKMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5JbigpO3RoaXMuR2EmJnRoaXMuSG4oKX19fSkoYyk7dmFyIE5hPWMuY2p8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnBiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLm9iPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjt0aGlzLmVmPSExO3RoaXMucWE9dGhpcy5RYz0iIjt0aGlzLiRlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnlmPSExO3RoaXMuaWE9W107dGhpcy5XZT10aGlzLlZiPSIiO3RoaXMuamU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5pZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMubGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuYWM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2I9IiI7dGhpcy5YYj0KW107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmliPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmFiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkhkPTA7dGhpcy5waD0hMTt0aGlzLm9oPTFFMzt0aGlzLkVjPSExO3RoaXMuUGE9MUUzO3RoaXMua2Q9dGhpcy5sZD0iIjt0aGlzLkRiPW51bGw7dGhpcy5HaT0hMTt0aGlzLlljPXRoaXMuUWQ9bnVsbH1jLnhqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkNhLGFkdGFncGFyYW1ldGVyOnRoaXMucGIsYWR0YWdtb2RpZmllcjp0aGlzLm9iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5lYyxhZHRhZ3JlZ2V4OnRoaXMucWQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuZmYsCnNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLHNlcnZlcjp0aGlzLmlhLHN2bUNvbmZpZzp0aGlzLlZiLGhvbWFkQWRwYXRoOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5qZSxIT01BRF9CTE9DS0VEOnRoaXMuaWUsSE9NQURfTk9CTE9DS0VSOnRoaXMubGIsSE9NQURfQURCTE9DS0VSOnRoaXMuYWMsdGVzdEhpZGU6dGhpcy5XYix0ZXN0VGFnczp0aGlzLlhiLHRlc3RUYWdzSlM6dGhpcy5ZYix0ZXN0VGFnc1hIUjp0aGlzLmJkLHRlc3QzUENvb2tpZTp0aGlzLnRjLHRocm90dGxlOnRoaXMuWmQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5uYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmFiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5iYix2cGFpZDp0aGlzLmliLHNraXBBbGxvd2VkOnRoaXMuTGYsdm1hcHM6dGhpcy5hZyxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuRWMsYWRGYWxsYmFja1VSTDp0aGlzLmxkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5rZCx5aWVsZGxhYjp0aGlzLkRifX0sUG46ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMucGI9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYKKHRoaXMub2I9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuZmY9Yi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLnpiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuVGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmVmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLlFjPWIuZ2xvYmFsQ29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuJGU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5pYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlZiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5XZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5qZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJgoodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5sYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYodGhpcy5XYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5YYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlliPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuYmQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnRjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5aZD1iLnRocm90dGxlKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuSGc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMueGM9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5zZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5XZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLmJlPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYWI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmKHRoaXMuYmI9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5pYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5MZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5hZz1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkVjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LG9tOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYWJbYV0mJjE9PXRoaXMuYWJbYV0mJihiPSEwKTtyZXR1cm4gYn0sRWY6ZnVuY3Rpb24oYil7dGhpcy5hYltiXT0hMH0sWWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuYWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5hYlthXSYmMT09dGhpcy5hYlthXSYmYi5wdXNoKGEpO3JldHVybiBifSxYZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9Zi4kayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBnPSIiLGM9IiIsZj0iIixoPSIiO2lmKCF0aGlzLkNhJiYhYSlyZXR1cm4gbmV3IEMoYik7Zz10aGlzLmNmKGIpO2M9dGhpcy5hYShiKTtnPyh0aGlzLlNjKCk/Zj1iOmY9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZj10aGlzLnFjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMucGJ8fHRoaXMub2J8fAp0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5abShoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLiRsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sY2Y6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlNjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LGRmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuY2YoYik7cmV0dXJuIGF9LCRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLlJwOwpyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxIaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGcpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxZbTpmdW5jdGlvbihiLGEpe3ZhciBkPWYuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPApoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5IaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPXRoaXMuSGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Z31sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBnPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxabTpmdW5jdGlvbihiKXt0aGlzLnBiJiYoYis9dGhpcy5wYik7aWYodGhpcy5vYilmb3IodmFyIGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm9iW2FdKSk7aWYoZi5KYylmb3IodmFyIGQ9MDtkPGYuSmMubGVuZ3RoO2QrKyl7dmFyIGc9CmYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuWW0oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmYS5YbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuV24oYi5wbGF5ZXIpO2EuZigpfX0sZzpmdW5jdGlvbihiLGEsZCxnLGMsZil7bD10aGlzO3RoaXMuZWY9ITA7dGhpcy5RYz1iO3RoaXMucWE9YTt0aGlzLnlmPWQ7dGhpcy5lZT1nO3RoaXMuaWM9Yzt0aGlzLnhhPWZ8fHt9O3RoaXMucGwoKTt0aGlzLlBtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnFhKXRoaXMuTm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuR2MoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LENsOmZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQ9ITE7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxQbTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5RYyt0aGlzLnhlKCJnbG9iYWwiKSksdGhpcy5tbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkdjKCl9LmJpbmQodGhpcyksITApfSxObTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5xYSt0aGlzLnhlKCJjbGllbnQiLAotMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuU2IoKSk7dGhpcy54YSYmdGhpcy54YS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YiYmKGQ9IiIpO3RoaXMueGEmJnRoaXMueGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5zZCl7dGhpcy5zZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZSl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0KITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuJGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTt0aGlzLkJiKCk7Zi5MYyhrLnFuKTsoYT1mLlVhKHRoaXMuSWQoKSkpfHwoYT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxtbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZz0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmCihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihhLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnFhfHx0aGlzLlZifHx0aGlzLkFhfHx0aGlzLkdjKCk6KHRoaXMuQ2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5CYigpKX19LEdjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7CnRyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGQuc2VydmVyLmxlbmd0aDthKyspe3ZhciBiPWQuc2VydmVyW2FdO3RyeXt2YXIgZTsoZT12b2lkIDA9PT1iKXx8KGU9IWIucmVwbGFjZSgiW2hhc2hdIix0aGlzLkpmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpKS5tYXRjaChSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSkpO2lmKGUpcmV0dXJuITF9Y2F0Y2goZyl7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9CihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChmLlIoIndlYi5kZSIpfHxmLlIoImdteC5uZXQiKXx8Zi5SKCJnbXguYXQiKXx8Zi5SKCJnbXguY2giKXx8Zi5SKCIxdW5kMS5kZSIpKSYmIXRoaXMuU2MoKSlmb3IoYj0wO2I8dGhpcy5pYS5sZW5ndGg7YisrKXRoaXMuaWFbYl09dGhpcy5pYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8CiExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJnRoaXMuQWEmJnRoaXMuaWEubGVuZ3RoP3RoaXMuVGMoITEpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5sYikpLHRoaXMuQmIoKSl9LGNpOmZ1bmN0aW9uKGEpe3RoaXMubGR8fCh0aGlzLmxkPWF8fCIiKX0sVGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUyl7dmFyIGU9e307aWYoYSl7dmFyIGU9bmV3IEModGhpcy5xYygpKSxkPXRoaXMuYWEodGhpcy5WYik7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtlLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2UubWV0aG9kPSJQT1NUIn1lbHNlIGU9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGUsdGhpcy5yby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTthP3RoaXMuams/dGhpcy5zYSgibm9TVk1Db25maWciKToodGhpcy5qaz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuVGMoITApfS5iaW5kKHRoaXMpLCEwKX19LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBlPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtpZighdGhpcy5uYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubmM9ITA7dGhpcy5UYyghMCk7cmV0dXJufX1lPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZT0hMCl9Y2F0Y2goaCl7fWlmKCEoZXx8CmQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2EucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5XZj10aGlzLkFiKGQuc3RyaWN0KTt0aGlzLmJlPXRoaXMuQWIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuU2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmJiPXRoaXMuQWIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkFiKGQuZW5hYmxlZCk7dGhpcy5XYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlliPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuYmQ9ZC50ZXN0YWR0YWdzeGhyfHwKW107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5wYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLm9iPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5xZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5mZj1kLmpzcG9wdXBzfHwhMTt0aGlzLnpiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLmliPWQudnBhaWR8fCExO3RoaXMueGEudnBhaWQ9dGhpcy5pYjt0aGlzLkxmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMudGQ9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmFnPWQudm1hcHN8fCIiO3RoaXMuRWM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlpkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307dGhpcy5EYj0KZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuQ28oKSYmKHRoaXMuV2J8fHRoaXMuWWJ8fHRoaXMuWGJ8fHRoaXMuYmQpP3RoaXMueWY/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5FZSgpLHRoaXMuQmIoKSk6dGhpcy51bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlRmKCkpfX0sVG06ZnVuY3Rpb24oYSl7dGhpcy5HaT0hMDt2YXIgZT1mdW5jdGlvbihhKXtpZihhPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnwgKSIrYSsiPShbXjtdKykiKSkpcmV0dXJuIGFbMl19KCJhZHBfc2VncyIpfHwiZTAiLGU9dGhpcy5EYi51cmwucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltzZWdzXSIsCmVuY29kZVVSSUNvbXBvbmVudChlKSksZT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6ZSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLnFiKGUpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07Zi5LZCh0aGlzLnFjKCksIlBPU1QiLGUsZnVuY3Rpb24oZSl7dHJ5e3ZhciBnPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe31mLnRyYWNrKCJzdGF0c19oZF95bF9kYXRhIiwhKCFnfHwhZy5sZW5ndGgpLCEwKTt0cnl7aWYoZyYmZy5sZW5ndGgmJnRoaXMuRGIucGFyYW1ldGVyKXt2YXIgaD10aGlzLkRiLnBhcmFtZXRlci5zcGxpdCgiW2lkXSIpLmpvaW4oZ1swXS5pZHx8IjAiKSxoPWguc3BsaXQoIltwcmljZV0iKS5qb2luKGdbMF0ucHJpY2V8fDApO3RoaXMucGIrPWh9fWNhdGNoKEIpe2EoKX1hKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthKCl9LmJpbmQodGhpcyksITApfSx1bzpmdW5jdGlvbigpe3RoaXMudG8oKTt0aGlzLnZvKCl9LAp2bzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGU9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cud2lkdGg9MTtnLmhlaWdodD0xO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1mLlYoMTApLGg9Zi5WKDEwKSxCPWYuVigxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJkYXRhIiwiIil9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShCKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZi5xYihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGcpfWNhdGNoKGEpe31pZigzIT0KZCl7dmFyIGI9Zi5CZCgpO2lmKChiLmlzQ2hyb21lfHxiLmlzRmlyZWZveCkmJiFiLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsZSwhMCk7cmV0dXJufXRoaXMuc2EoImNzcF8iK2UpfWYudHJhY2soInN0YXRzX2hkX2NzcCIsZSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFRmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxZZDpmdW5jdGlvbihhKXt0aGlzLnhjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkNhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYihhKSksdGhpcy5CYigpLHRoaXMuRWUoKSl9LHRvOmZ1bmN0aW9uKCl7aWYodGhpcy5XYil7dmFyIGE9Zi5CZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuQ20oKSl0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTtlLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZD0wPT09ZS5vZmZzZXRXaWR0aHx8MD09PWUub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSk7YT1kfWNhdGNoKGcpe31hP3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMubGkoKX19ZWxzZSB0aGlzLmxpKCl9LFJmOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPQpkLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy55byhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlhiPXRoaXMuYmQpJiZ0aGlzLlhiLmxlbmd0aCl7dmFyIGQ9dGhpcy5YYi5zbGljZSgpLGc9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LHlvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gYygpe3JldHVybiBmPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGYpLCEwKTohMX12YXIgZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0aGlzLkthKG5ldyBDKGEpLGcsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxsaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz0KZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuem8oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuWWImJnRoaXMuWWIubGVuZ3RoKXt2YXIgZD10aGlzLlliLnNsaWNlKCksZzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUmYoKX0sem86ZnVuY3Rpb24oYSxlLGQpe2Z1bmN0aW9uIGcoKXtmKCkmJmUoKX1mdW5jdGlvbiBjKCl7ZigpJiZkKCl9ZnVuY3Rpb24gZigpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZSxkKXtkPT1hJiZmKCkmJgpjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtnKCl9fSxRZjpmdW5jdGlvbigpe2lmKHRoaXMudGMpdHJ5e2YuS2QodGhpcy50YywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5IYj0hdGhpcy5BYihhLmNjKTt0aGlzLlRmKCl9LmJpbmQodGhpcyksdGhpcy5qaS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmppKCl9ZWxzZSB0aGlzLlRmKCl9LGppOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpO3RoaXMuRWUoKX0sQ206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sCkJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMueGMmJihlPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2UsITApO3RoaXMuQ2EmJnRoaXMuaXNFbmFibGVkJiZ0aGlzLlFkJiZ0aGlzLmNsKCk7dGhpcy50YyYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkhiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5qZSkpO3RoaXMuZWUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZSYmdGhpcy5lZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5IYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuWWM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ZYy5pZD1mLlYoMTApO3RoaXMuWWMuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLlljKTt2YXIgYT10aGlzLlljLmNvbnRlbnRXaW5kb3csZT0KYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD1mdW5jdGlvbigpe2Zvcih2YXIgZSxnPTA7Zzx0aGlzLlFkLmxlbmd0aDtnKyspZT1hLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGUudHlwZT0idGV4dC9qYXZhc2NyaXB0IixlLnNyYz10aGlzLlFkW2ddLGEuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX0uYmluZCh0aGlzKTtlLnNyYz1mLkFlKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZSk7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZi50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sb2w6ZnVuY3Rpb24oKXtpZih0aGlzLmJlJiZ0aGlzLm9tKCkpe3ZhciBhPQp0aGlzLllsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZSl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZSxkLGcsYyxoKXt0aGlzLkhkfHwodGhpcy5IZD0wKTt0aGlzLkhkKys7dGhpcy5IZD50aGlzLm9oJiYhdGhpcy5waCYmKHRoaXMucGg9ITAsZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLm9oLCEwKSk7YT1uZXcgTWEoYSxlLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpO2cmJihhLkZpPSEwKTtjJiZmLkFtKCkmJihhLlpnPSEwKTtoJiYKKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLldtfHwodGhpcy5XbT0hMCxmLkRhKCl8fGYuZWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhlPWEucmVzcG9uc2VYTUwpfHwoZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJmcuY2hpbGROb2Rlc1swXT9nLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOgoiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGUpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoZSk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsCmcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LHNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmFnfSxtbDpmdW5jdGlvbigpe3RoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuS2EoYSx0aGlzLlBvLmJpbmQodGhpcyksdGhpcy5Pby5iaW5kKHRoaXMpKX0sClBvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5KbCgpfSxPbzpmdW5jdGlvbigpe30sSmw6ZnVuY3Rpb24oKXtmLkxjKGsuSWwpO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09ZS50eXBlJiZmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09ZS50eXBlKXt2YXIgZD1uZXcgSTt3aW5kb3dbZC5nYSgpXT0KdGhpcztmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LENvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWmR9LFNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGU9IiIsZD0wO2Q8YTtkKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGV9LEFiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0iIixkLGcsYyxmLGgsayxsPTA7bDxhLmxlbmd0aDspZD0KYS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZT1lKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBlfSxhYTpmdW5jdGlvbihhKXt2YXIgZT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtlW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixlKXtiJiYoZC5xdWVyeUtleVtiXT1lKX0pO3JldHVybiBkfSxKZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBlKGEpe3ZhciBiPSIiLGUsZDtmb3IoZT03OzA8PWU7ZS0tKWQ9YT4+PjQqZSYxNSxiKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGcsYyxmPUFycmF5KDgwKSwKaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChnKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKylmW2ddPWQoZltnLTNdXmZbZy04XV5mW2ctMTRdXmZbZy0xNl0sMSk7Yz1oO249aztwPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZwfH5uJnIpK3UrZltnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnB8biZyfHAmcikrdStmW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTYwOzc5Pj1nO2crKyl2PWQoYyw1KSsobl5wXnIpK3UrZltnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLApjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihlKGgpK2UoaykrZShsKStlKG0pK2UodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnhqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLlVrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSxkKXt0aGlzLmE9YTthLmMuUD90aGlzLmdiPWEuYy5QKCk6dGhpcy5nYj0iIjthLmMud2gmJmEuYy53aCh7cGF1c2U6dGhpcy5OZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLiRoLmJpbmQodGhpcyksbXV0ZTp0aGlzLm9mLmJpbmQodGhpcyksCnVubXV0ZTp0aGlzLkpvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEuc2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5qYz10aGlzLnJkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9ZTt0aGlzLmpiPXt9O3RoaXMudmlkZW89e307dGhpcy5WZD17fTtmLnZiKCJuZXdCaWdBZElkIik7dGhpcy5ibD1mLlYoMTApO3RoaXMuTmY9MDt0aGlzLm9kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMub2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMub2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuVGs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5XYz10aGlzLlVkPSExO3RoaXMuRmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy53ZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMub2M9ITE7dGhpcy56bD1mLlYoMTApO3RoaXMuUmI9Zi5WKDEwKTt0aGlzLlBiPWYuVigxMCk7dGhpcy5laT1mLlYoMTApO3RoaXMuY29uZj17fTt0aGlzLmZlPXRoaXMuJGI9dGhpcy5JZT10aGlzLnlkPXRoaXMuV2Q9dGhpcy5DYj10aGlzLnZjPXRoaXMuT2g9dGhpcy5IZT10aGlzLkRkPXRoaXMuRG89dGhpcy5GYj10aGlzLlFiPSExO3RoaXMuQWM9W107dGhpcy5wYz17fTt0aGlzLm1uPTIwMDt0aGlzLmRnPXRoaXMuZGQ9dGhpcy5GYz10aGlzLmNnPXRoaXMueGY9ITE7dGhpcy5xZj17fX1jLnJqPWE7YS5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihlPQp0aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBlfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5OYiYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMua28oKTtmLm8oay5Layx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqZjpmdW5jdGlvbihhLGUsZCxnKXt0aGlzLkZiPWQ7dmFyIGM9ITE7ZyYmZy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGM9ITApO2lmKHRoaXMuQS5TKXRoaXMuTmYrKyxmLnZiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxnPWwuZ2V0Q29uZmlnKCksZi5PZyYmKHRoaXMuQS5Qbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5BLkNhJiZ0aGlzLkEuaXNFbmFibGVkPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCwKa2VlcFVSTDplLGJpdHJhdGU6Zy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5pYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTplPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaWIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpnLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5RYSgpO2Vsc2V7dmFyIGg9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmNvKHRoaXMuYik7dGhpcy5raChhKTt0aGlzLkFjPXRoaXMuYWgoYSk7dGhpcy5zbCgpfSxraDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmltKGIpKSx0aGlzLmtoKGIucGFyZW50KSl9LGFoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5haChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlRsKGIpKSk7cmV0dXJuIGV9LFRsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLmtwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmNuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5IbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMubG8oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Rbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsubHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5vcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLk1vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLk5vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sY286ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuamIuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS5ycT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlRrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk9rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5taShlKSl7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5SayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmpiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuamIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuYW8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sYW86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuU2sodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5QaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMueWkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLmxtKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5abygpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuQ2ksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5jcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaHAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZ3AoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5pcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5lcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5EaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGUpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmFwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LCRvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0sYXA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sYnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LFpvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuZ2koKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxncDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxpcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LERpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LFlvOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsuanAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkRpKCEwKX0sT2s6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBlPWIuYWEoYSk7cmV0dXJuIGUucHJvdG9jb2wrIjovLyIrZS5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLlVvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbWk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFJrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5CaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQWk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm1pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlNvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLlJvKCk7dGhpcy55aSgpO3RoaXMuQmcoKTt0aGlzLmEuUGgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5kaSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuYmImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LExrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZmgoYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5pbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuTGsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5nbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuamIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS52aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlloKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkloKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sVW86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQmk6ZnVuY3Rpb24oKXtpZih0aGlzLkRvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5HbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5DaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmpiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLnZpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxzaTpmdW5jdGlvbigpe3RoaXMuT2h8fCh0aGlzLk9oPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxHbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudGl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnNpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuZ2koKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5iYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy50aT1hKX0sZmk6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxrbzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sZ2k6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LGxvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5iYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5iYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLnltKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGUpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkRsKHRoaXMuYi5PYSxhKX1jYXRjaChCKXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5OayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLlBrKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5YaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxQazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFhoOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sbm86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sam06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxEbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxTbzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy56aS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnppLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sUm86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuJGcoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm5pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Fby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5laTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LG9pOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LEVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sRm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxKbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuSG0oKSYmdGhpcy5HbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLkhvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LEhtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuaWJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5pYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5pYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxHbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sWmw6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LEhvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmlmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7fXRoaXMueGQoKX12YXIgZT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMsZD10aGlzLlpsKCk7dGhpcy5GYz10aGlzLldjPXRoaXMuZGQ9dGhpcy5kZz0hMDtyZXR1cm4gZT8oZi5lYigiaHR0cHM6Ly93d3cud2VsZWN0LmRlL2FwaS92MS9wcmVmbGlnaHQvYnlfYWxpYXMvIitlLCJkZXdlbGVjdHd3d3dlbGVjdGRlIix7fSxhLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpLHRoaXMuQSksITApOiExfSxMZzpmdW5jdGlvbihhKXt0aGlzLm5vKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZyghMCl9LmJpbmQodGhpcyksCnRoaXMubW4pOih0aGlzLldkPSEwLHRoaXMuYS5WZSgpLHRoaXMuYS5NbigpLHRoaXMub2M9ITEsYT10aGlzLmIuc3x8e30sdGhpcy5IZXx8KGEubm9Db21wbGV0ZVF1YXJ0aWxlPSEwKSxmLm8oay55bCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMuUmUoKS5ZaCgpKX0sUmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZi5hZih0aGlzLnZpZGVvLGEpP3RoaXMuJGgoKTp0aGlzLk5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIucmIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuRWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmCihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuQWMmJjA8dGhpcy5BYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuQWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sdTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYmwrIi0iK3RoaXMuTmY7dGhpcy5iJiZ0aGlzLmIuZ2gmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLmdoKCkpO3JldHVybiBhfSxSZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMucmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMucXB8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsZCxjKXt0aGlzLm9wdGlvbnM9Y3x8e307ZT1kO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm9hPW51bGw7dGhpcy5ZPVtdO3RoaXMuSj1udWxsO3RoaXMuemM9dGhpcy5CYz0hMTt0aGlzLmJhPSIiO3RoaXMuYmc9ITE7dGhpcy5yaD0iIjtjJiZjLmVtcHR5P3RoaXMuU20oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxlLGQ9W107Yy5zaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpLGI7Yj1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBlPSIiO2IucXVlcnlLZXkmJihlPWIucXVlcnlLZXkuaHZwKTtlJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBDKHRoaXMudXJsKTpsLnZhKGwuWGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7CnZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52cGFpZCYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfS5iaW5kKHRoaXMpLGM9ZnVuY3Rpb24oKXtyZXR1cm4gZCgpJiYoZi5SKCJtYXJ0aGFzdGV3YXJ0LmNvbSIpfHxmLlIoImZhbmRvbS5jb20iKXx8Zi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKX0uYmluZCh0aGlzKTtpZihkKCl8fGMoKSl7dmFyIGg9Zi5OZyh0aGlzLnVybCk7aHx8KGg9dGhpcy51cmwpO3ZhciBjPWZ1bmN0aW9uKCl7cmV0dXJuIDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4gMDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksbT1mdW5jdGlvbigpe3JldHVybihmLlIoImdpZ2EuZGUiKXx8Zi5SKCJraW5vLmRlIil8fGYuUigic3BpZWxldGlwcHMuZGUiKXx8Zi5SKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbj1mdW5jdGlvbigpe3JldHVybiAwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil8fDA8aC5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfS5iaW5kKHRoaXMpO2lmKGMoKXx8aygpfHxtKCl8fCJhcHBzcG90Ij09ZSluKCk/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5YZChoKSkrIiZ0eXBlPWpzIixiPWwudmEobC5YZCh0aGlzLnVybCksCiExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGYudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPWwudmEobC5YZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLlJtLmJpbmQodGhpcyksdGhpcy5PbS5iaW5kKHRoaXMpKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMub2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmCmEuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09Zi5OYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZVtiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goYyl7ZVtiXT17fX1lbHNlIGUuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZT1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSwKYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWYuTmJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1mLk5ifHx0aGlzLkVtKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLnNvKCkpdHJ5e3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1jLmxlbmd0aCYmKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrY1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1nLmZpcnN0Q2hpbGQ7ZS5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksCmI9MDtiPGEubGVuZ3RoO2IrKyllLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGUpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LEVtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sZT10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrCjYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9ZT8hMDohMX0sUm06ZnVuY3Rpb24oYSl7dGhpcy54bihhKTt0cnl7dGhpcy5vYT1hLnJlc3BvbnNlWE1MLHRoaXMub2F8fCh0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5yaD1hLnVybENhbGxlZDtpZih0aGlzLlkubGVuZ3RoKXRoaXMuVmMoKTtlbHNle3RoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKTt0cnl7Zi50cmFjaygic3RhdHNfaGRfbXR5dXJsIixmLlVhKHRoaXMuYmEpLCEwKX1jYXRjaChlKXt9fX0sU206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMub2F8fAoodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5ZLmxlbmd0aD90aGlzLlZjKCk6dGhpcy5yYSh0aGlzLlJhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5uZTpGLmdnfSkpfSxPbTpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5SYSh2LmZnLHtkZXB0aDpifSkpfSxWYzpmdW5jdGlvbigpe3RoaXMuSj10aGlzLlkuc2hpZnQoKTt0aGlzLkltKCk/dGhpcy5BbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLmxoKCksZSx7QWRTeXN0ZW06dGhpcy5TbCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuUmEodi5pZykpOihiPTAsdGhpcy5LbygpJiZ0aGlzLnVmKHRoaXMuQmwoKSkpfSxwZjpmdW5jdGlvbigpe3RoaXMuQmM/KHRoaXMuQmM9MTx0aGlzLlkubGVuZ3RoLAp0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LnBmKCl9LEloOmZ1bmN0aW9uKCl7dGhpcy56Yz8odGhpcy56Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5JaCgpfSxLbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhvKCk/dGhpcy53bygpPyEwOigtMSE9dGhpcy5OYygpP3RoaXMucmEodGhpcy5SYSh2LmhlKSk6dGhpcy5yYSh0aGlzLlJhKHYuZWcpKSwhMSk6KHRoaXMucmEodGhpcy5SYSh2LmZkLEYuaGcpKSwhMSl9LHVmOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmdlfHwoYS5nZT1bXSk7YS5nZS5wdXNoKHRoaXMucmgpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5sZigpKTthLkViPWEuRWI/YS5FYjp0aGlzLkJjO2EueWM9YS55Yz9hLnljOnRoaXMuemM7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT8KYS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzt0aGlzLnBhcmVudC51ZihhKX0sQmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZHVyYXRpb249dGhpcy5OYygpO2EuTj10aGlzLmloKCk7YS5yYj10aGlzLlVsKCk7YS55cT1bXTthLm9yaWdpbj10aGlzO2Eucz10aGlzLlJsKCk7YS5NZj10aGlzLmhtKGEuZHVyYXRpb24pO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztyZXR1cm4gYX0scmE6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPQphLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7aWYoIXRoaXMuSiYmdGhpcy5vYSYmdGhpcy5vYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLm9hO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGU9ITE7KGU9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZS5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuT2E9YS5lcnJvci5jb2RlIT12LmhlLmNvZGU/YS5PYS5jb25jYXQodGhpcy5WbCgpKTphLk9hLmNvbmNhdCh0aGlzLmRtKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQua2MmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5rYyYmdGhpcy5wYXJlbnQua2MoYSksYj0wLHRoaXMuVmMoKSk6KHRoaXMucGFyZW50JiYKdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sa2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQua2MoYSl9LFVnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLlJhKGEsYikpfSxSYTpmdW5jdGlvbihhLGIpe3ZhciBlPW5ldyBUYShhLGIpO2Uub3JpZ2luPXRoaXM7cmV0dXJuIGV9LEFvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmloKCkubGVuZ3RofSx3bzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuTmMoKX0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxraTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuU2YoKSYmCihhPSEwKTtyZXR1cm4gYX0seG46ZnVuY3Rpb24oYSl7dGhpcy5iYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLmJhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuYmE9IlVOS05PV04ifXRyeXt0aGlzLmJnPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGUpe319LEltOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5saCgpLmxlbmd0aH0sbGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSxTbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBkPWFbZV07W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7dHJ5e2lmKCJUcmFja2luZyI9PWQmJmEmJmEucGFyZW50Tm9kZSYmIlRyYWNraW5nRXZlbnRzIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lJiYoYS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJOb25MaW5lYXJBZHMiPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZXx8YS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJDb21wYW5pb24iPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpcmV0dXJufWNhdGNoKGUpe31pZihhJiYhdGhpcy55aChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy50YihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LHloOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT0KYS5ub2RlTmFtZT8hMDp0aGlzLnloKGEucGFyZW50Tm9kZSk6ITF9LGRtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxVbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxpaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKWIucHVzaCh7aWQ6YVtlXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2VdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbZV0uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtlXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksCmhlaWdodDphW2VdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksU3A6YVtlXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMudGIoYVtlXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUGF8fDFFMzt0cnl7dmFyIGM9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlBhKS1NYXRoLmFicyhkLWIuUGEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWMuY29uY2F0KGYpfWNhdGNoKGgpe31yZXR1cm4gYn0sUmw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGU9ITEsZD1bXSxiPSExLGM9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Yz1iPXRoaXMuR2QoYVtoXSk7dHJ5e2U9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtlPWJ9ZC5wdXNoKGUpO2YucHVzaChjKX0xPGEubGVuZ3RoPyhiPWQsaD1jKTooYj1lLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMudGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxobTpmdW5jdGlvbihhKXt2YXIgYj0hMSxlPSExLGQ9ITE7dHJ5e2U9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWUuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1mLmhvKGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGMpe2I9ITF9cmV0dXJuIGJ9LFFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy50YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sVGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuR2QoYSk6IiJ9LEdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuVGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLnNrfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuUGx8fFVhO25ldyBVYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTj1bXTt0aGlzLnJiPSIiO3RoaXMucz10aGlzLnljPXRoaXMuRWI9ITE7dGhpcy5YZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuWWU9IiJ9Yy5Zaj1hO2EucHJvdG90eXBlPXt2bDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk4ubGVuZ3RoO2UrKylpZigwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxibTpmdW5jdGlvbigpe2lmKCF0aGlzLlhlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ub2Epe3ZhciBhPXRoaXMub3JpZ2luLm9hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxlPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKykoZT1hW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWUuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuWGU9YVtkXSl9cmV0dXJuIHRoaXMuWGV9LApnaDpmdW5jdGlvbigpe2lmKHRoaXMuWWUpcmV0dXJuIHRoaXMuWWU7dmFyIGE9IiI7KGE9dGhpcy5ibSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuWWU9YX0sbG06ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk5bZV07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLllqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLmFsfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt2YXIgdj17b2U6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsTmE6IlhNTF9QQVJTRV9FUlJPUiJ9LGVnOnt0eXBlOiJlcnJvciIsY29kZToyMDIsCm1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTmE6IkRVUkFUSU9OX0VSUk9SIn0sZmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE5hOiJFTVBUWV9WQVNUIn0saWc6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTmE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LGZnOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApOYToiTE9BRF9FUlJPUiJ9LGtlOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixOYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LHNwOnt0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE5hOiJNRURJQUZJTEVfRVJST1IifSxoZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixOYToiRFVNTVlfQUQifX0sRj17Z2c6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixOYToiTk9fQURTIn0saGc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE5hOiJOT19NRURJQUZJTEVTIn0sdHA6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE5hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sbmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTmE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2E9Yy5HbHx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmVycm9yPWE7dGhpcy5BZD1lO3RoaXMuT2E9W107dGhpcy5vcmlnaW49bnVsbH1jLmhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5oanx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWGE9CmMubGt8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5aaD1hO3RoaXMudmlkZW89ZTt0aGlzLmNlPVtdO3RoaXMuV2g9W107dGhpcy5yZj1bXTt0aGlzLlRvPSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5JKCl9Yy51cD1hO2EucHJvdG90eXBlPXtJOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLlpoLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuWmhbYV0sZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCwKYz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7dmFyIGg9Zi5jb250ZW50V2luZG93O2gubnE9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuSm4uYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuQ24uYmluZCh0aGlzKX07dmFyIGs9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7ay5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Euc3JjPWQ7aC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2guZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTsKdGhpcy5jZS5wdXNoKHtzcmM6ZCxmcmFtZTpmLG5uOmMsdmVuZG9yOmUuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLnJmLmxlbmd0aDtlKyspe3ZhciBkPXRoaXMucmZbZV07ZC50eXBlPT09YSYmZC5mbCh0aGlzLldsKGEpKX19LFdsOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e3dxOiEwLHZxOjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e2txOiJ2aWRlbyIsenE6ImpzQ3VzdG9tIixBcToiMS4wLjAtZGV2In19O2Nhc2UgInN0YXJ0IjpyZXR1cm57dHlwZToic3RhcnQiLGRhdGE6e2R1cmF0aW9uOjEwLEJxOjEsVHA6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIiwKZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sa206ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLmNlLmxlbmd0aDtlKyspaWYodGhpcy5jZVtlXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLmNlW2VdLm5uO3JldHVybiIifSxKbjpmdW5jdGlvbihhLGUpe3RoaXMuV2gucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMua20oZSksdmVuZG9yOmV9KTt0aGlzLmpvKCl9LENuOmZ1bmN0aW9uKGEsZSl7InZpZGVvIj09PWE/dGhpcy5Uby5tYXAoZnVuY3Rpb24oYSl7dGhpcy56ZyhhLGUpfS5iaW5kKHRoaXMpKTp0aGlzLnpnKGEsZSl9LHpnOmZ1bmN0aW9uKGEsZSl7dGhpcy5yZi5wdXNoKHt0eXBlOmEsCmZsOmUsdHE6ITF9KX0sam86ZnVuY3Rpb24oKXt0aGlzLldoLm1hcChmdW5jdGlvbihhKXthLkJtfHwoYS5tcSh7YWRTZXNzaW9uSWQ6Zi5WKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS54cSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuQm09ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmpuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWE9Yy5qbnx8WWE7bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmNvbmY9ZXx8e307dGhpcy5jPWE7dGhpcy5zYj1hLmRoKCk7dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSC5pZD0KZi5WKDEwKTt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5IYT17fTt0aGlzLkFnPSExO3RoaXMuZmM9W119Yy5laj1hO2EucHJvdG90eXBlPXtRbDpmdW5jdGlvbihhKXt2YXIgZT17fSxkPSExLGM9MCxlPTAsZj17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPSJmaXhlZCIsYz1lLmxlZnQsZT1lLnRvcCk7Zj17eDpjLHk6ZX07Zi5wb3NpdGlvbj1kO3JldHVybiBmfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlFsKGEpO2Zvcih2YXIgZT0wLGQ9MCxjPSExLGY9dGhpcy5xbShhKSxoPXt9O2E7KWUrPWEub2Zmc2V0TGVmdCsKYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZiYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxlKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxkKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihjPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmUseTpkfTtjJiYoaC5wb3NpdGlvbj1jKTtyZXR1cm4gaH0scW86ZnVuY3Rpb24oKXt0aGlzLkFnPSEwfSx2aTpmdW5jdGlvbigpe3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwKIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5jLmwoKSl9LE1uOmZ1bmN0aW9uKCl7dGhpcy5BZ3x8KHRoaXMuYy5wbGF5KCksZi5vKGsud2QsdGhpcy5jLmwoKSkpfSxLZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5jLnBhdXNlKCk7dGhpcy5ILnN0eWxlLnpJbmRleD1hO3RoaXMuSC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkguc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSC5zdHlsZS5ib3hTaXppbmc9dGhpcy5zYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuc2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkIuc3R5bGUud2lkdGg9dGhpcy5zYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLnNiKTt0aGlzLmMuWmMmJnRoaXMuYy5aYygpP3RoaXMuYy5kaCgpLmFwcGVuZENoaWxkKHRoaXMuSCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkgpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5jLmV4aXRGdWxsc2NyZWVuKCl9LHFtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8ZSYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPQohMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sTmw6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5nZXRQb3NpdGlvbihhKTtlLnBvc2l0aW9uP2UucG9zaXRpb249ZS5wb3NpdGlvbjplLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZS53aWR0aD1hLm9mZnNldFdpZHRoO2UuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBlfSxtYzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLk5sKHRoaXMuc2IpO2lmKGUueCE9dGhpcy5IYS54fHxlLnkhPXRoaXMuSGEueXx8ZS5wb3NpdGlvbiE9dGhpcy5IYS5wb3NpdGlvbnx8ZS53aWR0aCE9dGhpcy5IYS53aWR0aHx8ZS5oZWlnaHQhPXRoaXMuSGEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuSGEud2lkdGgmJjA8dGhpcy5IYS5oZWlnaHQmJjA9PWUud2lkdGgmJjA9PWUuaGVpZ2h0KXt0aGlzLlZlKCk7cmV0dXJufXRoaXMuSGE9ZTt0aGlzLmMuWmMoKT8odGhpcy5ILnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5ILnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSC5zdHlsZS5sZWZ0PQplLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWUueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZS5wb3NpdGlvbjt0aGlzLkIuc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5mYy5sZW5ndGg7YSsrKXRoaXMuZmNbYV0oe3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSl9Zi5QZih0aGlzLkgpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSx5ZzpmdW5jdGlvbihhKXt0aGlzLmZjfHwodGhpcy5mYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuZmMucHVzaChhKX0sVmU6ZnVuY3Rpb24oKXt0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTsKdGhpcy5CJiZ0aGlzLkIucGF1c2UmJnRoaXMuQi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuZWp8fFphLEQ9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWYuVigxMCk7TS5jb250cm9scz0hMDtELnB1c2goTSl9dmFyIEo9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYj1jLmFufHxhYjtuZXcgYWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwoYT10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3RoaXMuVChiKTt0aGlzLlJkKGEpO3RoaXMuUGcoKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZHx8KHRoaXMuaWQ9YSl9LFBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5UYSgpLGI9dGhpcy52aWRlb1RhZztifHwoKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiZhLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wYXJhbWV0ZXJzJiYhMT09PWEucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxlPXRoaXMuVGEoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7YS5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYX19KX0pKGMpOwp2YXIgYmI9Yy5Tanx8YmI7KGZ1bmN0aW9uKGMpe2MuUmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5kYz10aGlzLmRjfHwhMTt0aGlzLnFnPXRoaXMuc2c9dGhpcy52aD10aGlzLnphPXRoaXMuVWY9ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5MbChhLGIpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52aCYmdGhpcy5HZygpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLk1iO2EmJmEub2MmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudWQoKTt0aGlzLnZoPSEwO3RoaXMuR2coKX0uYmluZCh0aGlzKSk7dGhpcy5EZygpfSxHZzpmdW5jdGlvbigpe2lmKCF0aGlzLmRjKXt0aGlzLnVkKCk7aWYoIXRoaXMuVWYmJiF0aGlzLnVkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5VZiYmdGhpcy5xZyYmIXRoaXMuc2cmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSx1ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYSYmYS5hZE1hbmFnZXJzJiZhLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0samg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmU9MDtlPGIubW9kdWxlcy5sZW5ndGg7ZSsrKXt2YXIgYz1iLm1vZHVsZXNbZV07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LERnOmZ1bmN0aW9uKCl7aWYodGhpcy51ZCgpKXt2YXIgYT10aGlzLmpoKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuc2c9MDxhLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5xZz1hLlFwfXRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzQWRQbGF5aW5nP2EuaXEoKTohMX0sTmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QWREdXJhdGlvbj9hLk5jKCk6LTF9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzUGxheWluZyYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxMbDpmdW5jdGlvbihhLGIpe3RoaXMuZGM9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5kY3x8MzAyPT10aGlzLmRjP3RoaXMuemE9ITA6dGhpcy5tKCJhZGVycm9yIix0aGlzLmRjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfSx2ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT8odGhpcy53KCksdGhpcy5qYSgpKTphLlplKCk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuZW0oYSk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIGNiPWMuUmp8fGNiOyhmdW5jdGlvbihjKXtjLlRqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sRG06ZnVuY3Rpb24oKXt3aW5kb3cuT08uY2suR2suRWs/d2luZG93Lk9PLmNrLkdrLkVrLk9wKGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRtKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZhPTE1MDA7dmFyIGE9ZGEoKTtpZihhJiZhLl9faW50ZXJuYWwmJmEuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGYuU2UoYS5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYiBpbiBhLl9faW50ZXJuYWwucGxheWVycylpZihhLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGU9bmV3IGJiKGEuX19pbnRlcm5hbC5wbGF5ZXJzW2JdKTt0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBjYihlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgZGI9Yy5Uanx8ZGIsZWI9bmV3IGRiKHQpO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmxufHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5XaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLmhhPSExO3RoaXMubWgoKX0sbWg6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2F8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpOwphJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1oKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuU2goKX0sU2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYT90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2goKX0uYmluZCh0aGlzKSwKMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5XaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuVmk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sRGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5jb2RlLGU9YS5tZXNzYWdlO2EuZGF0YSYmKGI9YS5kYXRhLmNvZGUsZT1hLmRhdGEubWVzc2FnZSk7MTIwNSE9YiYmKDkwMD09YiYmMDxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKSk6MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/dGhpcy5qYSgpOnRoaXMuaSgpKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHMpO2EucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLkRlKGEpfS5iaW5kKHRoaXMpKTsKYS5wbGF5ZXIub24oInBsYXlpbmciLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRlKGEuYWRFcnJvckV2ZW50cyl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuVml8fGhiOyhmdW5jdGlvbihjKXtjLlhpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLlJkKE1hdGguY2VpbCgxRTEwKgpNYXRoLnJhbmRvbSgpKSksdGhpcy5MKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5VaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pO3RoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliLFQ9bmV3IGliKHQpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuYmt8fApqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubmt8fFU7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5uZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5obihhKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKdy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0saG46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZTtmb3IoZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkpe2I9aXNOYU4oYVtlXSk/ITE6YVtlXTtpZigxMDA5PT1hW2VdfHwxMDAxPT1hW2VdfHwzMDM9PWFbZV18fDQwMz09YVtlXSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGMgaW4gYVtlXSlpZihhW2VdLmhhc093blByb3BlcnR5KGMpJiYoYj1pc05hTihhW2VdW2NdKT8hMTphW2VdW2NdLDEwMDk9PWFbZV1bY118fDEwMDE9PWFbZV1bY118fDMwMz09YVtlXVtjXXx8NDAzPT1hW2VdW2NdKSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMubWt8fFY7KGZ1bmN0aW9uKGMpe2Mub2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLk1kJiYoYT1mLkVsKGEsdGhpcy5NZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTChkKTt2YXIgZz1uZXcgVihkLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuTWR8fAoodGhpcy5NZD1bXSksdGhpcy5NZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5LKGQpfHwodGhpcy5MKGQpLGc9bmV3IFYoZCx0aGlzLkYpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLk8oKX0sbmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwodGhpcy5jYVthXT17fSk7dGhpcy5jYVthXVtiXXx8KHRoaXMuY2FbYV1bYl09W10pO3RoaXMuY2FbYV1bYl0ucHVzaChjKX0sQm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYl0pdGhpcy5VY3x8KHRoaXMuVWM9W10pLHRoaXMuVWMucHVzaChhKSx0aGlzLkxuKCkmJih0aGlzLkFmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYl1bY10mJjA8dGhpcy5jYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPQowO2Q8dGhpcy5jYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuY2FbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9YS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ3LkJvKGEpfX0pfSkoYyk7dmFyIGtiPWMub2t8fGtiLHc9bmV3IGtiKHQpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5tcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMubXB8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sCnVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5TaXx8bWI7KGZ1bmN0aW9uKGMpe2MuVGk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2YuSmMucHVzaCh7Ilt3aWR0aF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRXaWR0aH0pO2YuSmMucHVzaCh7IltoZWlnaHRdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0SGVpZ2h0fSk7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkOwphLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5UaXx8bmI7KGZ1bmN0aW9uKGMpe2MuVWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZCk7dGhpcy5LKGgpfHwodGhpcy5MKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5MYSlpZihiPT10aGlzLkxhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5VaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMubnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLm5wfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Paj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy50bHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudWwoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSWcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz0KYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsaD1hLnNvdXJjZS5DSE9PU0VSX1RJTUV8fCIiO2YudHJhY2soInN0YXRzX2Nob29zZXJfYWIiLGMsITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfaW50ZXJhY3Rpb24iLGMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLklnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuQm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy5oYz1bXSk7dGhpcy5oYy5wdXNoKGEpfSx1bDpmdW5jdGlvbigpe2lmKHRoaXMuaGMmJnRoaXMuaGMubGVuZ3RoKWZvcih2YXIgYT0KMDthPHRoaXMuaGMubGVuZ3RoO2ErKyl0cnl7dGhpcy5oY1thXSgpfWNhdGNoKGIpe319LEZkOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylyZXR1cm4gdGhpcy5LYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEJuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuT2p8fHJiOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpO3RoaXMuRWk9ITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMuRWkmJih0aGlzLmkoKSx0aGlzLkVpPSEwLHRoaXMubmEoKSk7Yi5UYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSmV8fCh0aGlzLkplPTEpLHRoaXMuSmUrKywxMDA8dGhpcy5KZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTmp8fHNiOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT0KYSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHJiKGFbZF0pLHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLlBqfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlBpfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmI7KGZ1bmN0aW9uKGMpe2Mud2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LHpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuem4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuQ2Mpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtCjE7YisrKTEwMDkhPXRoaXMuaGJbYl0mJjMwMyE9dGhpcy5oYltiXSYmNDAzIT10aGlzLmhiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy53a3x8d2I7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuSyhjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IHdiKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciB4Yj1jLnlrfHwKeGIseWI9bmV3IHhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMuTWp8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnZmPSExfSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zbigpfS5iaW5kKHRoaXMpLDUwMCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLApiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnZmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnZmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmCmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LG1vOmZ1bmN0aW9uKCl7dGhpcy52Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuaGt8fEFiOyhmdW5jdGlvbihjKXtjLmdrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5WbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudWN8fCh0aGlzLnVjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLnVjfHx0aGlzLnVjKyssdGhpcy51Yzw9dGhpcy5WbT8odGhpcy51YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuZ2t8fEJiOyhmdW5jdGlvbihjKXtjLmlrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuaWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLlFqfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5laz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5la3x8RmI7KGZ1bmN0aW9uKGMpe2MuZGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVGEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLndsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5NbSgpOnRoaXMuRmcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSx3bDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkliKCk7IWEucGEmJmEuWSYmYS5OcCYmYS5QcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEZnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCl9LmJpbmQodGhpcyksMTAwKX0sSWI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5JYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5UYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sanE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSWIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuZGt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbmw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTChhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLm5sKGFbYl0pO3RoaXMuTygpfX0pO2MuZ2QuSWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy5wcHx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuS2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0saHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sWmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVGE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLktqfHxYOyhmdW5jdGlvbihjKXtjLkpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLndmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMud2Y9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy53ZiYmYyE9dGhpcy53Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLlIoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLm9xKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmp8fFk7KGZ1bmN0aW9uKGMpe2MuTGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLkFmKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMuTGp8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5Wb3x8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5wanx8TmI7KGZ1bmN0aW9uKGMpe2Mub2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTT10aGlzLk18fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxDZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkNlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLm9qfHxPYjsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTmIoYVtiXSk7Yy5oYXx8dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgT2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFBiPWMucWp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmZrfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT8oYz1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuWml8fFNiOyhmdW5jdGlvbihjKXtjLiRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy4kaXx8VGI7KGZ1bmN0aW9uKGMpe2MuYWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGM9bmV3IFNiKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSx3aW5kb3cuYnJpZHBsYXllcj1jLChuZXcgVGIoYyx0aGlzLkYpKS5mKCkpfX10aGlzLk8oKX19KX0pKGMpO3ZhciBVYj1jLmFqfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMuV2t8fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSxhZTpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LEFuOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuQmt8fFhiOyhmdW5jdGlvbihjKXtjLkFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0sZ2M6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkhrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuSGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmdjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuRG4oKX0sRG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55bj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy55bj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmdjKGEpKX19KX0pKGMpO3ZhciBZYj1jLkFrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhLkFuKCksYT1uZXcgWWIoYSx0aGlzLkYpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFpiPWMuQ2t8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5rbnx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy4kbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLiRkKGEpfS5iaW5kKHRoaXMpKX0sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5xa3x8TjsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuT2UpaWYodGhpcy5PYnx8Cih0aGlzLk9iPTApLHRoaXMuT2IrKywxNTx0aGlzLk9iKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLlpuKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5NKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5NPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMucGt8fE87KGZ1bmN0aW9uKGMpe2Mucms9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuQWYoKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBiYz1jLnJrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5GbHx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Hanx8WjsoZnVuY3Rpb24oYyl7Yy5Gaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuTT10aGlzLk18fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuU2IoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy55YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx5YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTT1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRmp8fGFhOyhmdW5jdGlvbihjKXtjLkhqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuSGp8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLklvfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLm1qfHxoYzsoZnVuY3Rpb24oYyl7Yy5saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5FZygpfSxFZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMubGp8fAppYzsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLkwoYSk7KG5ldyBpYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGpjPWMubmp8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLnJwfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLklpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5CZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnphPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5CZS5iaW5kKHRoaXMpLDEwMCl9LEJlOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5IaXx8bmM7KGZ1bmN0aW9uKGMpe2MuSmk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxTYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBuYyhhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgb2M9Yy5KaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuTWl8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5PZD1bXTt0aGlzLnpmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy4kaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmZtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnpmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy56ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5PZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxmbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy56ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxvbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5PZC5sZW5ndGg7YSsrKXRoaXMuT2RbYV0uWmImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZFthXS5aYil9fX0pKGMpO3ZhciByYz0KYy4kanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkttPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy5LbXx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGsuTG8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGsuZW4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTmUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5kanx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLkxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi52YigibmV3QWRkZWxpdmVyeSIpfWMuS2k9YTthLnByb3RvdHlwZT17Vm46ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApSbjpmdW5jdGlvbihhKXt0aGlzLkxiPWF9LFFuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LCRjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnVtKCkpdGhpcy5MYi5nKHRoaXMuTGIuUWMsdGhpcy5MYi5xYSx0aGlzLkxiLnlmLGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTGIuaWMpO2Vsc2UgaWYobC5EYiYmIWwuR2kpbC5UbShmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhrLkhjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5xbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTGIsaCk7bS5Obih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmdmJiYoZD10aGlzLnBsYXllci5nZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5qZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx1bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LGZvOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuJGMoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX0sZW86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRmYoInBvc3Ryb2xsIik7Zi52YigicG9zdHJvbGwiKTt0aGlzLlZuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLiRjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxHbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmJvKHRoaXMuZW8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sVGQ6ZnVuY3Rpb24oYSl7Zi52YigibWlkcm9sbCIpO2YuRmYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy4kYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxGbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLlVuKHRoaXMuVGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubWYoKX0sZjpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLnBsYXllci5tZiYmdGhpcy5GbigpO3RoaXMuR24oKX19fSkoYyk7dmFyIGZhPWMuS2l8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy55anx8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGJhZXJhZUhpVGhlcmVpbmcsYmFlcmFlSGlUaGVyZWluZyk7Cg==
- 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 73F9
|
754 B
1 KB
|
21ms
20ms
|
XHR
application/json |
143.204.101.32
AMAZON-02
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=1941503792
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGJhZXJhZUhpVGhlcmVpbmc9YmFlcmFlSGlUaGVyZWluZ3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnRtKCkse2lkOmF9KX0sNTAwKTtpZihmLnBuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5SbihsKTtiLlFuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLlluKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlFpfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudm4uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnFoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnRqPWE7YS5wcm90b3R5cGU9e3BvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5xaFtiXSYmKHRoaXMucWhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5wbygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sU2s6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LHZuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLnVuKGIuZGF0YSl9LHVuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmgoYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZmg6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sUWs6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5PbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sT2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFlnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxGbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxlaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sJG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLiRuKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0semg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LAp6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPXo7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYSh6KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LHFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCx6PTA7ejxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeisrKSxnPWIuY2hhckNvZGVBdCh6KyspLHE9Yi5jaGFyQ29kZUF0KHorKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxBbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSx6PSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksej0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtSaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxybTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx6azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sSWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxrazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlJpKCl8fGIuWWkoKXx8Yi5ybSgpfHxiLlVqKCl8fGIuemsoKXx8Yi5JaigpfHxiLmtrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0sZ206ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LGhvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LCRnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnBuPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSx3bjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LGlvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMud24oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5GbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5lYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5lYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlFtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LFluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LHltOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnRqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnNqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eua3A9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5vcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuUW89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmNuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5scD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQ2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5nbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuanA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLk5vPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5lbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5zanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkptfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuY20oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy51anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLmdqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuYmo9YX0pKGMpO3ZhciBLPWMuYmp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5PaXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuU24oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LExuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxTbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkRoJiZMLm9vKGEpfSwkcDpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sem06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlpqfHxwOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sYm86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sVW46ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxacDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk1rKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApicTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxlcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFZwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5MaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy5YbT0zMDt0aGlzLmJjPVtdO3RoaXMubmI9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnhpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy5UbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnhpfHwodGhpcy54aT0hMCxmLmtmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxzbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnNtKCk7CmlmKCF0aGlzLndtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMubmIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5uYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm5iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksYT10aGlzLm5iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LFpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxUbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTGl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5OaXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaWp8fG9hOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5NcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmpqfHxwYTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMua2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkRrfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApO3RoaXMuVyhiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Eanx8c2E7KGZ1bmN0aW9uKGMpe2MuQ2o9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy50ZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGU9MDtlPApkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnJlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5YbSYmIXRoaXMueWEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTmQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMudGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5MZT90aGlzLkxlKys6dGhpcy5MZT0xOnRoaXMuS2U/CnRoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Danx8dGE7KGZ1bmN0aW9uKGMpe2MuRWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGU9MDtlPGIubGVuZ3RoO2UrKylhLnB1c2goYltlXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwplLndifHx0aGlzLksoZSl8fHRoaXMuem0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxYcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkxtfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy51az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwkZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGUpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnVrfHx4YTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy53aT0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5ibihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy55YigpKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuUigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9dGhpcy5PYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlJjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlJjfSx4bTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk9jKCksYj10aGlzLnZtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpe3RoaXMuRW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sRW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5SKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuUigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxXcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMueG0oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9jKCksYT10aGlzLlBjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5NPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmCmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZnE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/KHRoaXMudygpLHRoaXMuamEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55YSgpfHwoYXx8KHRoaXMud2k9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMud2ksZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHJsOmZ1bmN0aW9uKCl7dGhpcy5ncXx8KDEwPHRoaXMuV28/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMuV28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5LbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxLbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ybyl7dGhpcy5Ybz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksCjUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB5YT1jLnRrfHx5YTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5oaSh3aW5kb3cpOwpmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmhpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGhpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZGVvanMtcGxheWVyIikpJiZhLnBsYXllciYmYS5wbGF5ZXIucGxheWVyJiYoYT1hLnBsYXllci5wbGF5ZXIoKSxiLnB1c2goYSkpO2lmKDA8Zi5TZShiKSl7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmKGE9bmV3IHhhKGJbZV0pLGEuaGF8fHRoaXMuSyhhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgeWEoYSx0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuWmI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMudmt8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLnRmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5VKCk7CnJldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0scm46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fGIuTmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLnRmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCnVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE1hOmZ1bmN0aW9uKCl7fSwkZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLk9iKyssMTU8dGhpcy5PYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLk9lPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGU9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9CiEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLkJhKCk7CnZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuS2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLktsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Eucm4oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBSKGFbYl0pO2UuaGF8fHRoaXMuSyhlKXx8KHRoaXMuTChlKSwobmV3IENhKGUsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuWGt8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmVoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudG49YS5wb3NpdGlvbmluZzt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnN0eWxlLndpZHRoPWEud2lkdGg7ZS5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2Uuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtlLnN0eWxlLmhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1heEhlaWdodD0KYS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy50bil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTt0aGlzLkNkPWV9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5DZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQ2QpfSxsYTpmdW5jdGlvbigpe3JldHVybiEwfSxxbDpmdW5jdGlvbigpe2YuemgodGhpcy5DZCk7Zi5hZih0aGlzLkNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCmdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5Banx8R2E7KGZ1bmN0aW9uKGMpe2Muemo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhOyhmdW5jdGlvbihjKXtjLkJqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1mLmVoKGEsImVsZW1lbnRJRCIpO2lmKGYuemgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5LKGEpKSl7dGhpcy5MKGEpOyhuZXcgSWEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLkJqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5Wa3x8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnZqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sTms6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy52anx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCwKZyxjKXt0aGlzLkZhPWI7dGhpcy5aZz10aGlzLkZpPSExO3RoaXMuTGg9ZDt0aGlzLmlpPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmtiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbCYmbC5kZih0aGlzLkZhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2cmJjQhPWgucmVhZHlTdGF0ZSYmZyhoKX0uYmluZCh0aGlzKX1jLndqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhLmRhdGE7aWYoInN0cmluZyIhPQp0eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy5aZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5rYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5rYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmtiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuRml8fCh0aGlzLmtiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5rYi5zZW5kKGIpfWNhdGNoKGcpe2I9dGhpcy5GYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8CnRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTGgmJnRoaXMuTGgoKX1yZXR1cm4gdGhpcy5rYn19fSkoYyk7dmFyIE1hPWMud2p8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuY2o9YTthLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYil7dGhpcy5tZT1ifSxXbjpmdW5jdGlvbihiKXt0aGlzLkdhPWJ9LEluOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3ZwOiJBZENsaWNrVGhydSIseHA6IkFkRXJyb3IiLHlwOiJBZFN0b3BwZWQiLEJwOiJBZExpbmVhckNoYW5nZSIsQ3A6IkFkVGFnUGFyc2VkIixGcDoiQWRWaWRlb0NvbXBsZXRlIixJcDoiQWRMb2FkZWQiLApKcDoiQWRTa2lwcGVkIixLcDoiQWRTdGFydGVkIix6cDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEFwOiJBZEltcHJlc3Npb24iLHdwOiJBZENyZWF0aXZlVmlldyIsRHA6IkFkVmlkZW9NaWRwb2ludCIsRXA6IkFkUGF1c2VkIixHcDoiQWRWaWRlb1N0YXJ0IixIcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLm1lLGFbZF0pfSxIbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuR2EmJnRoaXMuR2EubGUpZm9yKHZhciBhIGluIHRoaXMuR2EubGUpdGhpcy5HYS5sZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkdhLHRoaXMuR2EubGVbYV0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuR2EuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwKMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5JbigpO3RoaXMuR2EmJnRoaXMuSG4oKX19fSkoYyk7dmFyIE5hPWMuY2p8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnBiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLm9iPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjt0aGlzLmVmPSExO3RoaXMucWE9dGhpcy5RYz0iIjt0aGlzLiRlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnlmPSExO3RoaXMuaWE9W107dGhpcy5XZT10aGlzLlZiPSIiO3RoaXMuamU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5pZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMubGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuYWM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2I9IiI7dGhpcy5YYj0KW107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmliPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmFiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkhkPTA7dGhpcy5waD0hMTt0aGlzLm9oPTFFMzt0aGlzLkVjPSExO3RoaXMuUGE9MUUzO3RoaXMua2Q9dGhpcy5sZD0iIjt0aGlzLkRiPW51bGw7dGhpcy5HaT0hMTt0aGlzLlljPXRoaXMuUWQ9bnVsbH1jLnhqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkNhLGFkdGFncGFyYW1ldGVyOnRoaXMucGIsYWR0YWdtb2RpZmllcjp0aGlzLm9iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5lYyxhZHRhZ3JlZ2V4OnRoaXMucWQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuZmYsCnNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLHNlcnZlcjp0aGlzLmlhLHN2bUNvbmZpZzp0aGlzLlZiLGhvbWFkQWRwYXRoOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5qZSxIT01BRF9CTE9DS0VEOnRoaXMuaWUsSE9NQURfTk9CTE9DS0VSOnRoaXMubGIsSE9NQURfQURCTE9DS0VSOnRoaXMuYWMsdGVzdEhpZGU6dGhpcy5XYix0ZXN0VGFnczp0aGlzLlhiLHRlc3RUYWdzSlM6dGhpcy5ZYix0ZXN0VGFnc1hIUjp0aGlzLmJkLHRlc3QzUENvb2tpZTp0aGlzLnRjLHRocm90dGxlOnRoaXMuWmQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5uYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmFiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5iYix2cGFpZDp0aGlzLmliLHNraXBBbGxvd2VkOnRoaXMuTGYsdm1hcHM6dGhpcy5hZyxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuRWMsYWRGYWxsYmFja1VSTDp0aGlzLmxkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5rZCx5aWVsZGxhYjp0aGlzLkRifX0sUG46ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMucGI9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYKKHRoaXMub2I9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuZmY9Yi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLnpiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuVGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmVmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLlFjPWIuZ2xvYmFsQ29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuJGU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5pYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlZiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5XZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5qZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJgoodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5sYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYodGhpcy5XYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5YYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlliPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuYmQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnRjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5aZD1iLnRocm90dGxlKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuSGc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMueGM9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5zZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5XZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLmJlPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYWI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmKHRoaXMuYmI9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5pYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5MZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5hZz1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkVjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LG9tOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYWJbYV0mJjE9PXRoaXMuYWJbYV0mJihiPSEwKTtyZXR1cm4gYn0sRWY6ZnVuY3Rpb24oYil7dGhpcy5hYltiXT0hMH0sWWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuYWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5hYlthXSYmMT09dGhpcy5hYlthXSYmYi5wdXNoKGEpO3JldHVybiBifSxYZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9Zi4kayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBnPSIiLGM9IiIsZj0iIixoPSIiO2lmKCF0aGlzLkNhJiYhYSlyZXR1cm4gbmV3IEMoYik7Zz10aGlzLmNmKGIpO2M9dGhpcy5hYShiKTtnPyh0aGlzLlNjKCk/Zj1iOmY9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZj10aGlzLnFjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMucGJ8fHRoaXMub2J8fAp0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5abShoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLiRsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sY2Y6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlNjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LGRmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuY2YoYik7cmV0dXJuIGF9LCRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLlJwOwpyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxIaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGcpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxZbTpmdW5jdGlvbihiLGEpe3ZhciBkPWYuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPApoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5IaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPXRoaXMuSGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Z31sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBnPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxabTpmdW5jdGlvbihiKXt0aGlzLnBiJiYoYis9dGhpcy5wYik7aWYodGhpcy5vYilmb3IodmFyIGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm9iW2FdKSk7aWYoZi5KYylmb3IodmFyIGQ9MDtkPGYuSmMubGVuZ3RoO2QrKyl7dmFyIGc9CmYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuWW0oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmYS5YbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuV24oYi5wbGF5ZXIpO2EuZigpfX0sZzpmdW5jdGlvbihiLGEsZCxnLGMsZil7bD10aGlzO3RoaXMuZWY9ITA7dGhpcy5RYz1iO3RoaXMucWE9YTt0aGlzLnlmPWQ7dGhpcy5lZT1nO3RoaXMuaWM9Yzt0aGlzLnhhPWZ8fHt9O3RoaXMucGwoKTt0aGlzLlBtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnFhKXRoaXMuTm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuR2MoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LENsOmZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQ9ITE7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxQbTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5RYyt0aGlzLnhlKCJnbG9iYWwiKSksdGhpcy5tbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkdjKCl9LmJpbmQodGhpcyksITApfSxObTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5xYSt0aGlzLnhlKCJjbGllbnQiLAotMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuU2IoKSk7dGhpcy54YSYmdGhpcy54YS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YiYmKGQ9IiIpO3RoaXMueGEmJnRoaXMueGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5zZCl7dGhpcy5zZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZSl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0KITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuJGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTt0aGlzLkJiKCk7Zi5MYyhrLnFuKTsoYT1mLlVhKHRoaXMuSWQoKSkpfHwoYT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxtbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZz0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmCihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihhLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnFhfHx0aGlzLlZifHx0aGlzLkFhfHx0aGlzLkdjKCk6KHRoaXMuQ2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5CYigpKX19LEdjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7CnRyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGQuc2VydmVyLmxlbmd0aDthKyspe3ZhciBiPWQuc2VydmVyW2FdO3RyeXt2YXIgZTsoZT12b2lkIDA9PT1iKXx8KGU9IWIucmVwbGFjZSgiW2hhc2hdIix0aGlzLkpmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpKS5tYXRjaChSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSkpO2lmKGUpcmV0dXJuITF9Y2F0Y2goZyl7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9CihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChmLlIoIndlYi5kZSIpfHxmLlIoImdteC5uZXQiKXx8Zi5SKCJnbXguYXQiKXx8Zi5SKCJnbXguY2giKXx8Zi5SKCIxdW5kMS5kZSIpKSYmIXRoaXMuU2MoKSlmb3IoYj0wO2I8dGhpcy5pYS5sZW5ndGg7YisrKXRoaXMuaWFbYl09dGhpcy5pYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8CiExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJnRoaXMuQWEmJnRoaXMuaWEubGVuZ3RoP3RoaXMuVGMoITEpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5sYikpLHRoaXMuQmIoKSl9LGNpOmZ1bmN0aW9uKGEpe3RoaXMubGR8fCh0aGlzLmxkPWF8fCIiKX0sVGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUyl7dmFyIGU9e307aWYoYSl7dmFyIGU9bmV3IEModGhpcy5xYygpKSxkPXRoaXMuYWEodGhpcy5WYik7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtlLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2UubWV0aG9kPSJQT1NUIn1lbHNlIGU9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGUsdGhpcy5yby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTthP3RoaXMuams/dGhpcy5zYSgibm9TVk1Db25maWciKToodGhpcy5qaz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuVGMoITApfS5iaW5kKHRoaXMpLCEwKX19LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBlPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtpZighdGhpcy5uYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubmM9ITA7dGhpcy5UYyghMCk7cmV0dXJufX1lPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZT0hMCl9Y2F0Y2goaCl7fWlmKCEoZXx8CmQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2EucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5XZj10aGlzLkFiKGQuc3RyaWN0KTt0aGlzLmJlPXRoaXMuQWIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuU2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmJiPXRoaXMuQWIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkFiKGQuZW5hYmxlZCk7dGhpcy5XYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlliPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuYmQ9ZC50ZXN0YWR0YWdzeGhyfHwKW107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5wYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLm9iPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5xZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5mZj1kLmpzcG9wdXBzfHwhMTt0aGlzLnpiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLmliPWQudnBhaWR8fCExO3RoaXMueGEudnBhaWQ9dGhpcy5pYjt0aGlzLkxmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMudGQ9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmFnPWQudm1hcHN8fCIiO3RoaXMuRWM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlpkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307dGhpcy5EYj0KZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuQ28oKSYmKHRoaXMuV2J8fHRoaXMuWWJ8fHRoaXMuWGJ8fHRoaXMuYmQpP3RoaXMueWY/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5FZSgpLHRoaXMuQmIoKSk6dGhpcy51bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlRmKCkpfX0sVG06ZnVuY3Rpb24oYSl7dGhpcy5HaT0hMDt2YXIgZT1mdW5jdGlvbihhKXtpZihhPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnwgKSIrYSsiPShbXjtdKykiKSkpcmV0dXJuIGFbMl19KCJhZHBfc2VncyIpfHwiZTAiLGU9dGhpcy5EYi51cmwucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltzZWdzXSIsCmVuY29kZVVSSUNvbXBvbmVudChlKSksZT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6ZSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLnFiKGUpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07Zi5LZCh0aGlzLnFjKCksIlBPU1QiLGUsZnVuY3Rpb24oZSl7dHJ5e3ZhciBnPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe31mLnRyYWNrKCJzdGF0c19oZF95bF9kYXRhIiwhKCFnfHwhZy5sZW5ndGgpLCEwKTt0cnl7aWYoZyYmZy5sZW5ndGgmJnRoaXMuRGIucGFyYW1ldGVyKXt2YXIgaD10aGlzLkRiLnBhcmFtZXRlci5zcGxpdCgiW2lkXSIpLmpvaW4oZ1swXS5pZHx8IjAiKSxoPWguc3BsaXQoIltwcmljZV0iKS5qb2luKGdbMF0ucHJpY2V8fDApO3RoaXMucGIrPWh9fWNhdGNoKEIpe2EoKX1hKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthKCl9LmJpbmQodGhpcyksITApfSx1bzpmdW5jdGlvbigpe3RoaXMudG8oKTt0aGlzLnZvKCl9LAp2bzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGU9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cud2lkdGg9MTtnLmhlaWdodD0xO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1mLlYoMTApLGg9Zi5WKDEwKSxCPWYuVigxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJkYXRhIiwiIil9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShCKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZi5xYihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGcpfWNhdGNoKGEpe31pZigzIT0KZCl7dmFyIGI9Zi5CZCgpO2lmKChiLmlzQ2hyb21lfHxiLmlzRmlyZWZveCkmJiFiLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsZSwhMCk7cmV0dXJufXRoaXMuc2EoImNzcF8iK2UpfWYudHJhY2soInN0YXRzX2hkX2NzcCIsZSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFRmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxZZDpmdW5jdGlvbihhKXt0aGlzLnhjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkNhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYihhKSksdGhpcy5CYigpLHRoaXMuRWUoKSl9LHRvOmZ1bmN0aW9uKCl7aWYodGhpcy5XYil7dmFyIGE9Zi5CZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuQ20oKSl0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTtlLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZD0wPT09ZS5vZmZzZXRXaWR0aHx8MD09PWUub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSk7YT1kfWNhdGNoKGcpe31hP3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMubGkoKX19ZWxzZSB0aGlzLmxpKCl9LFJmOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPQpkLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy55byhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlhiPXRoaXMuYmQpJiZ0aGlzLlhiLmxlbmd0aCl7dmFyIGQ9dGhpcy5YYi5zbGljZSgpLGc9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LHlvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gYygpe3JldHVybiBmPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGYpLCEwKTohMX12YXIgZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0aGlzLkthKG5ldyBDKGEpLGcsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxsaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz0KZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuem8oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuWWImJnRoaXMuWWIubGVuZ3RoKXt2YXIgZD10aGlzLlliLnNsaWNlKCksZzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUmYoKX0sem86ZnVuY3Rpb24oYSxlLGQpe2Z1bmN0aW9uIGcoKXtmKCkmJmUoKX1mdW5jdGlvbiBjKCl7ZigpJiZkKCl9ZnVuY3Rpb24gZigpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZSxkKXtkPT1hJiZmKCkmJgpjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtnKCl9fSxRZjpmdW5jdGlvbigpe2lmKHRoaXMudGMpdHJ5e2YuS2QodGhpcy50YywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5IYj0hdGhpcy5BYihhLmNjKTt0aGlzLlRmKCl9LmJpbmQodGhpcyksdGhpcy5qaS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmppKCl9ZWxzZSB0aGlzLlRmKCl9LGppOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpO3RoaXMuRWUoKX0sQ206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sCkJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMueGMmJihlPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2UsITApO3RoaXMuQ2EmJnRoaXMuaXNFbmFibGVkJiZ0aGlzLlFkJiZ0aGlzLmNsKCk7dGhpcy50YyYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkhiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5qZSkpO3RoaXMuZWUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZSYmdGhpcy5lZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5IYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuWWM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ZYy5pZD1mLlYoMTApO3RoaXMuWWMuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLlljKTt2YXIgYT10aGlzLlljLmNvbnRlbnRXaW5kb3csZT0KYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD1mdW5jdGlvbigpe2Zvcih2YXIgZSxnPTA7Zzx0aGlzLlFkLmxlbmd0aDtnKyspZT1hLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGUudHlwZT0idGV4dC9qYXZhc2NyaXB0IixlLnNyYz10aGlzLlFkW2ddLGEuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX0uYmluZCh0aGlzKTtlLnNyYz1mLkFlKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZSk7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZi50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sb2w6ZnVuY3Rpb24oKXtpZih0aGlzLmJlJiZ0aGlzLm9tKCkpe3ZhciBhPQp0aGlzLllsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZSl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZSxkLGcsYyxoKXt0aGlzLkhkfHwodGhpcy5IZD0wKTt0aGlzLkhkKys7dGhpcy5IZD50aGlzLm9oJiYhdGhpcy5waCYmKHRoaXMucGg9ITAsZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLm9oLCEwKSk7YT1uZXcgTWEoYSxlLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpO2cmJihhLkZpPSEwKTtjJiZmLkFtKCkmJihhLlpnPSEwKTtoJiYKKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLldtfHwodGhpcy5XbT0hMCxmLkRhKCl8fGYuZWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhlPWEucmVzcG9uc2VYTUwpfHwoZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJmcuY2hpbGROb2Rlc1swXT9nLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOgoiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGUpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoZSk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsCmcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LHNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmFnfSxtbDpmdW5jdGlvbigpe3RoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuS2EoYSx0aGlzLlBvLmJpbmQodGhpcyksdGhpcy5Pby5iaW5kKHRoaXMpKX0sClBvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5KbCgpfSxPbzpmdW5jdGlvbigpe30sSmw6ZnVuY3Rpb24oKXtmLkxjKGsuSWwpO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09ZS50eXBlJiZmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09ZS50eXBlKXt2YXIgZD1uZXcgSTt3aW5kb3dbZC5nYSgpXT0KdGhpcztmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LENvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWmR9LFNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGU9IiIsZD0wO2Q8YTtkKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGV9LEFiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0iIixkLGcsYyxmLGgsayxsPTA7bDxhLmxlbmd0aDspZD0KYS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZT1lKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBlfSxhYTpmdW5jdGlvbihhKXt2YXIgZT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtlW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixlKXtiJiYoZC5xdWVyeUtleVtiXT1lKX0pO3JldHVybiBkfSxKZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBlKGEpe3ZhciBiPSIiLGUsZDtmb3IoZT03OzA8PWU7ZS0tKWQ9YT4+PjQqZSYxNSxiKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGcsYyxmPUFycmF5KDgwKSwKaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChnKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKylmW2ddPWQoZltnLTNdXmZbZy04XV5mW2ctMTRdXmZbZy0xNl0sMSk7Yz1oO249aztwPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZwfH5uJnIpK3UrZltnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnB8biZyfHAmcikrdStmW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTYwOzc5Pj1nO2crKyl2PWQoYyw1KSsobl5wXnIpK3UrZltnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLApjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihlKGgpK2UoaykrZShsKStlKG0pK2UodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnhqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLlVrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSxkKXt0aGlzLmE9YTthLmMuUD90aGlzLmdiPWEuYy5QKCk6dGhpcy5nYj0iIjthLmMud2gmJmEuYy53aCh7cGF1c2U6dGhpcy5OZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLiRoLmJpbmQodGhpcyksbXV0ZTp0aGlzLm9mLmJpbmQodGhpcyksCnVubXV0ZTp0aGlzLkpvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEuc2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5qYz10aGlzLnJkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9ZTt0aGlzLmpiPXt9O3RoaXMudmlkZW89e307dGhpcy5WZD17fTtmLnZiKCJuZXdCaWdBZElkIik7dGhpcy5ibD1mLlYoMTApO3RoaXMuTmY9MDt0aGlzLm9kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMub2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMub2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuVGs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5XYz10aGlzLlVkPSExO3RoaXMuRmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy53ZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMub2M9ITE7dGhpcy56bD1mLlYoMTApO3RoaXMuUmI9Zi5WKDEwKTt0aGlzLlBiPWYuVigxMCk7dGhpcy5laT1mLlYoMTApO3RoaXMuY29uZj17fTt0aGlzLmZlPXRoaXMuJGI9dGhpcy5JZT10aGlzLnlkPXRoaXMuV2Q9dGhpcy5DYj10aGlzLnZjPXRoaXMuT2g9dGhpcy5IZT10aGlzLkRkPXRoaXMuRG89dGhpcy5GYj10aGlzLlFiPSExO3RoaXMuQWM9W107dGhpcy5wYz17fTt0aGlzLm1uPTIwMDt0aGlzLmRnPXRoaXMuZGQ9dGhpcy5GYz10aGlzLmNnPXRoaXMueGY9ITE7dGhpcy5xZj17fX1jLnJqPWE7YS5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihlPQp0aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBlfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5OYiYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMua28oKTtmLm8oay5Layx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqZjpmdW5jdGlvbihhLGUsZCxnKXt0aGlzLkZiPWQ7dmFyIGM9ITE7ZyYmZy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGM9ITApO2lmKHRoaXMuQS5TKXRoaXMuTmYrKyxmLnZiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxnPWwuZ2V0Q29uZmlnKCksZi5PZyYmKHRoaXMuQS5Qbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5BLkNhJiZ0aGlzLkEuaXNFbmFibGVkPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCwKa2VlcFVSTDplLGJpdHJhdGU6Zy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5pYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTplPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaWIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpnLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5RYSgpO2Vsc2V7dmFyIGg9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmNvKHRoaXMuYik7dGhpcy5raChhKTt0aGlzLkFjPXRoaXMuYWgoYSk7dGhpcy5zbCgpfSxraDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmltKGIpKSx0aGlzLmtoKGIucGFyZW50KSl9LGFoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5haChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlRsKGIpKSk7cmV0dXJuIGV9LFRsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLmtwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmNuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5IbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMubG8oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Rbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsubHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5vcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLk1vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLk5vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sY286ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuamIuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS5ycT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlRrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk9rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5taShlKSl7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5SayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmpiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuamIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuYW8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sYW86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuU2sodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5QaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMueWkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLmxtKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5abygpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuQ2ksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5jcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaHAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZ3AoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5pcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5lcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5EaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGUpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmFwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LCRvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0sYXA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sYnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LFpvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuZ2koKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxncDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxpcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LERpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LFlvOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsuanAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkRpKCEwKX0sT2s6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBlPWIuYWEoYSk7cmV0dXJuIGUucHJvdG9jb2wrIjovLyIrZS5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLlVvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbWk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFJrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5CaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQWk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm1pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlNvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLlJvKCk7dGhpcy55aSgpO3RoaXMuQmcoKTt0aGlzLmEuUGgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5kaSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuYmImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LExrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZmgoYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5pbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuTGsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5nbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuamIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS52aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlloKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkloKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sVW86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQmk6ZnVuY3Rpb24oKXtpZih0aGlzLkRvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5HbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5DaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmpiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLnZpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxzaTpmdW5jdGlvbigpe3RoaXMuT2h8fCh0aGlzLk9oPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxHbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudGl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnNpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuZ2koKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5iYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy50aT1hKX0sZmk6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxrbzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sZ2k6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LGxvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5iYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5iYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLnltKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGUpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkRsKHRoaXMuYi5PYSxhKX1jYXRjaChCKXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5OayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLlBrKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5YaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxQazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFhoOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sbm86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sam06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxEbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxTbzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy56aS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnppLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sUm86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuJGcoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm5pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Fby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5laTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LG9pOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LEVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sRm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxKbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuSG0oKSYmdGhpcy5HbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLkhvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LEhtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuaWJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5pYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5pYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxHbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sWmw6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LEhvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmlmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7fXRoaXMueGQoKX12YXIgZT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMsZD10aGlzLlpsKCk7dGhpcy5GYz10aGlzLldjPXRoaXMuZGQ9dGhpcy5kZz0hMDtyZXR1cm4gZT8oZi5lYigiaHR0cHM6Ly93d3cud2VsZWN0LmRlL2FwaS92MS9wcmVmbGlnaHQvYnlfYWxpYXMvIitlLCJkZXdlbGVjdHd3d3dlbGVjdGRlIix7fSxhLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpLHRoaXMuQSksITApOiExfSxMZzpmdW5jdGlvbihhKXt0aGlzLm5vKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZyghMCl9LmJpbmQodGhpcyksCnRoaXMubW4pOih0aGlzLldkPSEwLHRoaXMuYS5WZSgpLHRoaXMuYS5NbigpLHRoaXMub2M9ITEsYT10aGlzLmIuc3x8e30sdGhpcy5IZXx8KGEubm9Db21wbGV0ZVF1YXJ0aWxlPSEwKSxmLm8oay55bCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMuUmUoKS5ZaCgpKX0sUmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZi5hZih0aGlzLnZpZGVvLGEpP3RoaXMuJGgoKTp0aGlzLk5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIucmIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuRWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmCihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuQWMmJjA8dGhpcy5BYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuQWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sdTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYmwrIi0iK3RoaXMuTmY7dGhpcy5iJiZ0aGlzLmIuZ2gmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLmdoKCkpO3JldHVybiBhfSxSZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMucmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMucXB8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsZCxjKXt0aGlzLm9wdGlvbnM9Y3x8e307ZT1kO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm9hPW51bGw7dGhpcy5ZPVtdO3RoaXMuSj1udWxsO3RoaXMuemM9dGhpcy5CYz0hMTt0aGlzLmJhPSIiO3RoaXMuYmc9ITE7dGhpcy5yaD0iIjtjJiZjLmVtcHR5P3RoaXMuU20oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxlLGQ9W107Yy5zaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpLGI7Yj1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBlPSIiO2IucXVlcnlLZXkmJihlPWIucXVlcnlLZXkuaHZwKTtlJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBDKHRoaXMudXJsKTpsLnZhKGwuWGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7CnZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52cGFpZCYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfS5iaW5kKHRoaXMpLGM9ZnVuY3Rpb24oKXtyZXR1cm4gZCgpJiYoZi5SKCJtYXJ0aGFzdGV3YXJ0LmNvbSIpfHxmLlIoImZhbmRvbS5jb20iKXx8Zi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKX0uYmluZCh0aGlzKTtpZihkKCl8fGMoKSl7dmFyIGg9Zi5OZyh0aGlzLnVybCk7aHx8KGg9dGhpcy51cmwpO3ZhciBjPWZ1bmN0aW9uKCl7cmV0dXJuIDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4gMDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksbT1mdW5jdGlvbigpe3JldHVybihmLlIoImdpZ2EuZGUiKXx8Zi5SKCJraW5vLmRlIil8fGYuUigic3BpZWxldGlwcHMuZGUiKXx8Zi5SKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbj1mdW5jdGlvbigpe3JldHVybiAwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil8fDA8aC5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfS5iaW5kKHRoaXMpO2lmKGMoKXx8aygpfHxtKCl8fCJhcHBzcG90Ij09ZSluKCk/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5YZChoKSkrIiZ0eXBlPWpzIixiPWwudmEobC5YZCh0aGlzLnVybCksCiExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGYudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPWwudmEobC5YZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLlJtLmJpbmQodGhpcyksdGhpcy5PbS5iaW5kKHRoaXMpKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMub2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmCmEuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09Zi5OYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZVtiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goYyl7ZVtiXT17fX1lbHNlIGUuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZT1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSwKYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWYuTmJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1mLk5ifHx0aGlzLkVtKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLnNvKCkpdHJ5e3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1jLmxlbmd0aCYmKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrY1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1nLmZpcnN0Q2hpbGQ7ZS5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksCmI9MDtiPGEubGVuZ3RoO2IrKyllLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGUpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LEVtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sZT10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrCjYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9ZT8hMDohMX0sUm06ZnVuY3Rpb24oYSl7dGhpcy54bihhKTt0cnl7dGhpcy5vYT1hLnJlc3BvbnNlWE1MLHRoaXMub2F8fCh0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5yaD1hLnVybENhbGxlZDtpZih0aGlzLlkubGVuZ3RoKXRoaXMuVmMoKTtlbHNle3RoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKTt0cnl7Zi50cmFjaygic3RhdHNfaGRfbXR5dXJsIixmLlVhKHRoaXMuYmEpLCEwKX1jYXRjaChlKXt9fX0sU206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMub2F8fAoodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5ZLmxlbmd0aD90aGlzLlZjKCk6dGhpcy5yYSh0aGlzLlJhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5uZTpGLmdnfSkpfSxPbTpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5SYSh2LmZnLHtkZXB0aDpifSkpfSxWYzpmdW5jdGlvbigpe3RoaXMuSj10aGlzLlkuc2hpZnQoKTt0aGlzLkltKCk/dGhpcy5BbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLmxoKCksZSx7QWRTeXN0ZW06dGhpcy5TbCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuUmEodi5pZykpOihiPTAsdGhpcy5LbygpJiZ0aGlzLnVmKHRoaXMuQmwoKSkpfSxwZjpmdW5jdGlvbigpe3RoaXMuQmM/KHRoaXMuQmM9MTx0aGlzLlkubGVuZ3RoLAp0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LnBmKCl9LEloOmZ1bmN0aW9uKCl7dGhpcy56Yz8odGhpcy56Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5JaCgpfSxLbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhvKCk/dGhpcy53bygpPyEwOigtMSE9dGhpcy5OYygpP3RoaXMucmEodGhpcy5SYSh2LmhlKSk6dGhpcy5yYSh0aGlzLlJhKHYuZWcpKSwhMSk6KHRoaXMucmEodGhpcy5SYSh2LmZkLEYuaGcpKSwhMSl9LHVmOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmdlfHwoYS5nZT1bXSk7YS5nZS5wdXNoKHRoaXMucmgpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5sZigpKTthLkViPWEuRWI/YS5FYjp0aGlzLkJjO2EueWM9YS55Yz9hLnljOnRoaXMuemM7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT8KYS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzt0aGlzLnBhcmVudC51ZihhKX0sQmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZHVyYXRpb249dGhpcy5OYygpO2EuTj10aGlzLmloKCk7YS5yYj10aGlzLlVsKCk7YS55cT1bXTthLm9yaWdpbj10aGlzO2Eucz10aGlzLlJsKCk7YS5NZj10aGlzLmhtKGEuZHVyYXRpb24pO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztyZXR1cm4gYX0scmE6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPQphLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7aWYoIXRoaXMuSiYmdGhpcy5vYSYmdGhpcy5vYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLm9hO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGU9ITE7KGU9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZS5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuT2E9YS5lcnJvci5jb2RlIT12LmhlLmNvZGU/YS5PYS5jb25jYXQodGhpcy5WbCgpKTphLk9hLmNvbmNhdCh0aGlzLmRtKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQua2MmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5rYyYmdGhpcy5wYXJlbnQua2MoYSksYj0wLHRoaXMuVmMoKSk6KHRoaXMucGFyZW50JiYKdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sa2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQua2MoYSl9LFVnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLlJhKGEsYikpfSxSYTpmdW5jdGlvbihhLGIpe3ZhciBlPW5ldyBUYShhLGIpO2Uub3JpZ2luPXRoaXM7cmV0dXJuIGV9LEFvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmloKCkubGVuZ3RofSx3bzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuTmMoKX0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxraTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuU2YoKSYmCihhPSEwKTtyZXR1cm4gYX0seG46ZnVuY3Rpb24oYSl7dGhpcy5iYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLmJhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuYmE9IlVOS05PV04ifXRyeXt0aGlzLmJnPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGUpe319LEltOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5saCgpLmxlbmd0aH0sbGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSxTbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBkPWFbZV07W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7dHJ5e2lmKCJUcmFja2luZyI9PWQmJmEmJmEucGFyZW50Tm9kZSYmIlRyYWNraW5nRXZlbnRzIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lJiYoYS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJOb25MaW5lYXJBZHMiPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZXx8YS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJDb21wYW5pb24iPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpcmV0dXJufWNhdGNoKGUpe31pZihhJiYhdGhpcy55aChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy50YihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LHloOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT0KYS5ub2RlTmFtZT8hMDp0aGlzLnloKGEucGFyZW50Tm9kZSk6ITF9LGRtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxVbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxpaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKWIucHVzaCh7aWQ6YVtlXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2VdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbZV0uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtlXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksCmhlaWdodDphW2VdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksU3A6YVtlXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMudGIoYVtlXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUGF8fDFFMzt0cnl7dmFyIGM9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlBhKS1NYXRoLmFicyhkLWIuUGEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWMuY29uY2F0KGYpfWNhdGNoKGgpe31yZXR1cm4gYn0sUmw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGU9ITEsZD1bXSxiPSExLGM9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Yz1iPXRoaXMuR2QoYVtoXSk7dHJ5e2U9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtlPWJ9ZC5wdXNoKGUpO2YucHVzaChjKX0xPGEubGVuZ3RoPyhiPWQsaD1jKTooYj1lLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMudGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxobTpmdW5jdGlvbihhKXt2YXIgYj0hMSxlPSExLGQ9ITE7dHJ5e2U9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWUuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1mLmhvKGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGMpe2I9ITF9cmV0dXJuIGJ9LFFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy50YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sVGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuR2QoYSk6IiJ9LEdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuVGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLnNrfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuUGx8fFVhO25ldyBVYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTj1bXTt0aGlzLnJiPSIiO3RoaXMucz10aGlzLnljPXRoaXMuRWI9ITE7dGhpcy5YZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuWWU9IiJ9Yy5Zaj1hO2EucHJvdG90eXBlPXt2bDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk4ubGVuZ3RoO2UrKylpZigwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxibTpmdW5jdGlvbigpe2lmKCF0aGlzLlhlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ub2Epe3ZhciBhPXRoaXMub3JpZ2luLm9hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxlPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKykoZT1hW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWUuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuWGU9YVtkXSl9cmV0dXJuIHRoaXMuWGV9LApnaDpmdW5jdGlvbigpe2lmKHRoaXMuWWUpcmV0dXJuIHRoaXMuWWU7dmFyIGE9IiI7KGE9dGhpcy5ibSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuWWU9YX0sbG06ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk5bZV07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLllqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLmFsfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt2YXIgdj17b2U6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsTmE6IlhNTF9QQVJTRV9FUlJPUiJ9LGVnOnt0eXBlOiJlcnJvciIsY29kZToyMDIsCm1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTmE6IkRVUkFUSU9OX0VSUk9SIn0sZmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE5hOiJFTVBUWV9WQVNUIn0saWc6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTmE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LGZnOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApOYToiTE9BRF9FUlJPUiJ9LGtlOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixOYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LHNwOnt0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE5hOiJNRURJQUZJTEVfRVJST1IifSxoZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixOYToiRFVNTVlfQUQifX0sRj17Z2c6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixOYToiTk9fQURTIn0saGc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE5hOiJOT19NRURJQUZJTEVTIn0sdHA6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE5hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sbmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTmE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2E9Yy5HbHx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmVycm9yPWE7dGhpcy5BZD1lO3RoaXMuT2E9W107dGhpcy5vcmlnaW49bnVsbH1jLmhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5oanx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWGE9CmMubGt8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5aaD1hO3RoaXMudmlkZW89ZTt0aGlzLmNlPVtdO3RoaXMuV2g9W107dGhpcy5yZj1bXTt0aGlzLlRvPSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5JKCl9Yy51cD1hO2EucHJvdG90eXBlPXtJOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLlpoLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuWmhbYV0sZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCwKYz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7dmFyIGg9Zi5jb250ZW50V2luZG93O2gubnE9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuSm4uYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuQ24uYmluZCh0aGlzKX07dmFyIGs9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7ay5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Euc3JjPWQ7aC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2guZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTsKdGhpcy5jZS5wdXNoKHtzcmM6ZCxmcmFtZTpmLG5uOmMsdmVuZG9yOmUuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLnJmLmxlbmd0aDtlKyspe3ZhciBkPXRoaXMucmZbZV07ZC50eXBlPT09YSYmZC5mbCh0aGlzLldsKGEpKX19LFdsOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e3dxOiEwLHZxOjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e2txOiJ2aWRlbyIsenE6ImpzQ3VzdG9tIixBcToiMS4wLjAtZGV2In19O2Nhc2UgInN0YXJ0IjpyZXR1cm57dHlwZToic3RhcnQiLGRhdGE6e2R1cmF0aW9uOjEwLEJxOjEsVHA6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIiwKZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sa206ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLmNlLmxlbmd0aDtlKyspaWYodGhpcy5jZVtlXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLmNlW2VdLm5uO3JldHVybiIifSxKbjpmdW5jdGlvbihhLGUpe3RoaXMuV2gucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMua20oZSksdmVuZG9yOmV9KTt0aGlzLmpvKCl9LENuOmZ1bmN0aW9uKGEsZSl7InZpZGVvIj09PWE/dGhpcy5Uby5tYXAoZnVuY3Rpb24oYSl7dGhpcy56ZyhhLGUpfS5iaW5kKHRoaXMpKTp0aGlzLnpnKGEsZSl9LHpnOmZ1bmN0aW9uKGEsZSl7dGhpcy5yZi5wdXNoKHt0eXBlOmEsCmZsOmUsdHE6ITF9KX0sam86ZnVuY3Rpb24oKXt0aGlzLldoLm1hcChmdW5jdGlvbihhKXthLkJtfHwoYS5tcSh7YWRTZXNzaW9uSWQ6Zi5WKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS54cSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuQm09ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmpuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWE9Yy5qbnx8WWE7bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmNvbmY9ZXx8e307dGhpcy5jPWE7dGhpcy5zYj1hLmRoKCk7dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSC5pZD0KZi5WKDEwKTt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5IYT17fTt0aGlzLkFnPSExO3RoaXMuZmM9W119Yy5laj1hO2EucHJvdG90eXBlPXtRbDpmdW5jdGlvbihhKXt2YXIgZT17fSxkPSExLGM9MCxlPTAsZj17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPSJmaXhlZCIsYz1lLmxlZnQsZT1lLnRvcCk7Zj17eDpjLHk6ZX07Zi5wb3NpdGlvbj1kO3JldHVybiBmfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlFsKGEpO2Zvcih2YXIgZT0wLGQ9MCxjPSExLGY9dGhpcy5xbShhKSxoPXt9O2E7KWUrPWEub2Zmc2V0TGVmdCsKYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZiYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxlKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxkKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihjPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmUseTpkfTtjJiYoaC5wb3NpdGlvbj1jKTtyZXR1cm4gaH0scW86ZnVuY3Rpb24oKXt0aGlzLkFnPSEwfSx2aTpmdW5jdGlvbigpe3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwKIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5jLmwoKSl9LE1uOmZ1bmN0aW9uKCl7dGhpcy5BZ3x8KHRoaXMuYy5wbGF5KCksZi5vKGsud2QsdGhpcy5jLmwoKSkpfSxLZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5jLnBhdXNlKCk7dGhpcy5ILnN0eWxlLnpJbmRleD1hO3RoaXMuSC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkguc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSC5zdHlsZS5ib3hTaXppbmc9dGhpcy5zYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuc2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkIuc3R5bGUud2lkdGg9dGhpcy5zYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLnNiKTt0aGlzLmMuWmMmJnRoaXMuYy5aYygpP3RoaXMuYy5kaCgpLmFwcGVuZENoaWxkKHRoaXMuSCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkgpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5jLmV4aXRGdWxsc2NyZWVuKCl9LHFtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8ZSYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPQohMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sTmw6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5nZXRQb3NpdGlvbihhKTtlLnBvc2l0aW9uP2UucG9zaXRpb249ZS5wb3NpdGlvbjplLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZS53aWR0aD1hLm9mZnNldFdpZHRoO2UuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBlfSxtYzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLk5sKHRoaXMuc2IpO2lmKGUueCE9dGhpcy5IYS54fHxlLnkhPXRoaXMuSGEueXx8ZS5wb3NpdGlvbiE9dGhpcy5IYS5wb3NpdGlvbnx8ZS53aWR0aCE9dGhpcy5IYS53aWR0aHx8ZS5oZWlnaHQhPXRoaXMuSGEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuSGEud2lkdGgmJjA8dGhpcy5IYS5oZWlnaHQmJjA9PWUud2lkdGgmJjA9PWUuaGVpZ2h0KXt0aGlzLlZlKCk7cmV0dXJufXRoaXMuSGE9ZTt0aGlzLmMuWmMoKT8odGhpcy5ILnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5ILnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSC5zdHlsZS5sZWZ0PQplLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWUueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZS5wb3NpdGlvbjt0aGlzLkIuc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5mYy5sZW5ndGg7YSsrKXRoaXMuZmNbYV0oe3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSl9Zi5QZih0aGlzLkgpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSx5ZzpmdW5jdGlvbihhKXt0aGlzLmZjfHwodGhpcy5mYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuZmMucHVzaChhKX0sVmU6ZnVuY3Rpb24oKXt0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTsKdGhpcy5CJiZ0aGlzLkIucGF1c2UmJnRoaXMuQi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuZWp8fFphLEQ9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWYuVigxMCk7TS5jb250cm9scz0hMDtELnB1c2goTSl9dmFyIEo9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYj1jLmFufHxhYjtuZXcgYWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwoYT10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3RoaXMuVChiKTt0aGlzLlJkKGEpO3RoaXMuUGcoKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZHx8KHRoaXMuaWQ9YSl9LFBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5UYSgpLGI9dGhpcy52aWRlb1RhZztifHwoKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiZhLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wYXJhbWV0ZXJzJiYhMT09PWEucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxlPXRoaXMuVGEoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7YS5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYX19KX0pKGMpOwp2YXIgYmI9Yy5Tanx8YmI7KGZ1bmN0aW9uKGMpe2MuUmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5kYz10aGlzLmRjfHwhMTt0aGlzLnFnPXRoaXMuc2c9dGhpcy52aD10aGlzLnphPXRoaXMuVWY9ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5MbChhLGIpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52aCYmdGhpcy5HZygpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLk1iO2EmJmEub2MmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudWQoKTt0aGlzLnZoPSEwO3RoaXMuR2coKX0uYmluZCh0aGlzKSk7dGhpcy5EZygpfSxHZzpmdW5jdGlvbigpe2lmKCF0aGlzLmRjKXt0aGlzLnVkKCk7aWYoIXRoaXMuVWYmJiF0aGlzLnVkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5VZiYmdGhpcy5xZyYmIXRoaXMuc2cmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSx1ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYSYmYS5hZE1hbmFnZXJzJiZhLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0samg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmU9MDtlPGIubW9kdWxlcy5sZW5ndGg7ZSsrKXt2YXIgYz1iLm1vZHVsZXNbZV07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LERnOmZ1bmN0aW9uKCl7aWYodGhpcy51ZCgpKXt2YXIgYT10aGlzLmpoKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuc2c9MDxhLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5xZz1hLlFwfXRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzQWRQbGF5aW5nP2EuaXEoKTohMX0sTmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QWREdXJhdGlvbj9hLk5jKCk6LTF9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzUGxheWluZyYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxMbDpmdW5jdGlvbihhLGIpe3RoaXMuZGM9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5kY3x8MzAyPT10aGlzLmRjP3RoaXMuemE9ITA6dGhpcy5tKCJhZGVycm9yIix0aGlzLmRjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfSx2ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT8odGhpcy53KCksdGhpcy5qYSgpKTphLlplKCk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuZW0oYSk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIGNiPWMuUmp8fGNiOyhmdW5jdGlvbihjKXtjLlRqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sRG06ZnVuY3Rpb24oKXt3aW5kb3cuT08uY2suR2suRWs/d2luZG93Lk9PLmNrLkdrLkVrLk9wKGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRtKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZhPTE1MDA7dmFyIGE9ZGEoKTtpZihhJiZhLl9faW50ZXJuYWwmJmEuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGYuU2UoYS5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYiBpbiBhLl9faW50ZXJuYWwucGxheWVycylpZihhLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGU9bmV3IGJiKGEuX19pbnRlcm5hbC5wbGF5ZXJzW2JdKTt0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBjYihlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgZGI9Yy5Uanx8ZGIsZWI9bmV3IGRiKHQpO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmxufHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5XaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLmhhPSExO3RoaXMubWgoKX0sbWg6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2F8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpOwphJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1oKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuU2goKX0sU2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYT90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2goKX0uYmluZCh0aGlzKSwKMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5XaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuVmk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sRGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5jb2RlLGU9YS5tZXNzYWdlO2EuZGF0YSYmKGI9YS5kYXRhLmNvZGUsZT1hLmRhdGEubWVzc2FnZSk7MTIwNSE9YiYmKDkwMD09YiYmMDxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKSk6MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/dGhpcy5qYSgpOnRoaXMuaSgpKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHMpO2EucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLkRlKGEpfS5iaW5kKHRoaXMpKTsKYS5wbGF5ZXIub24oInBsYXlpbmciLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRlKGEuYWRFcnJvckV2ZW50cyl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuVml8fGhiOyhmdW5jdGlvbihjKXtjLlhpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLlJkKE1hdGguY2VpbCgxRTEwKgpNYXRoLnJhbmRvbSgpKSksdGhpcy5MKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5VaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pO3RoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliLFQ9bmV3IGliKHQpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuYmt8fApqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubmt8fFU7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5uZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5obihhKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKdy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0saG46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZTtmb3IoZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkpe2I9aXNOYU4oYVtlXSk/ITE6YVtlXTtpZigxMDA5PT1hW2VdfHwxMDAxPT1hW2VdfHwzMDM9PWFbZV18fDQwMz09YVtlXSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGMgaW4gYVtlXSlpZihhW2VdLmhhc093blByb3BlcnR5KGMpJiYoYj1pc05hTihhW2VdW2NdKT8hMTphW2VdW2NdLDEwMDk9PWFbZV1bY118fDEwMDE9PWFbZV1bY118fDMwMz09YVtlXVtjXXx8NDAzPT1hW2VdW2NdKSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMubWt8fFY7KGZ1bmN0aW9uKGMpe2Mub2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLk1kJiYoYT1mLkVsKGEsdGhpcy5NZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTChkKTt2YXIgZz1uZXcgVihkLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuTWR8fAoodGhpcy5NZD1bXSksdGhpcy5NZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5LKGQpfHwodGhpcy5MKGQpLGc9bmV3IFYoZCx0aGlzLkYpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLk8oKX0sbmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwodGhpcy5jYVthXT17fSk7dGhpcy5jYVthXVtiXXx8KHRoaXMuY2FbYV1bYl09W10pO3RoaXMuY2FbYV1bYl0ucHVzaChjKX0sQm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYl0pdGhpcy5VY3x8KHRoaXMuVWM9W10pLHRoaXMuVWMucHVzaChhKSx0aGlzLkxuKCkmJih0aGlzLkFmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYl1bY10mJjA8dGhpcy5jYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPQowO2Q8dGhpcy5jYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuY2FbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9YS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ3LkJvKGEpfX0pfSkoYyk7dmFyIGtiPWMub2t8fGtiLHc9bmV3IGtiKHQpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5tcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMubXB8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sCnVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5TaXx8bWI7KGZ1bmN0aW9uKGMpe2MuVGk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2YuSmMucHVzaCh7Ilt3aWR0aF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRXaWR0aH0pO2YuSmMucHVzaCh7IltoZWlnaHRdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0SGVpZ2h0fSk7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkOwphLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5UaXx8bmI7KGZ1bmN0aW9uKGMpe2MuVWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZCk7dGhpcy5LKGgpfHwodGhpcy5MKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5MYSlpZihiPT10aGlzLkxhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5VaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMubnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLm5wfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Paj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy50bHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudWwoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSWcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz0KYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsaD1hLnNvdXJjZS5DSE9PU0VSX1RJTUV8fCIiO2YudHJhY2soInN0YXRzX2Nob29zZXJfYWIiLGMsITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfaW50ZXJhY3Rpb24iLGMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLklnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuQm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy5oYz1bXSk7dGhpcy5oYy5wdXNoKGEpfSx1bDpmdW5jdGlvbigpe2lmKHRoaXMuaGMmJnRoaXMuaGMubGVuZ3RoKWZvcih2YXIgYT0KMDthPHRoaXMuaGMubGVuZ3RoO2ErKyl0cnl7dGhpcy5oY1thXSgpfWNhdGNoKGIpe319LEZkOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylyZXR1cm4gdGhpcy5LYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEJuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuT2p8fHJiOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpO3RoaXMuRWk9ITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMuRWkmJih0aGlzLmkoKSx0aGlzLkVpPSEwLHRoaXMubmEoKSk7Yi5UYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSmV8fCh0aGlzLkplPTEpLHRoaXMuSmUrKywxMDA8dGhpcy5KZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTmp8fHNiOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT0KYSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHJiKGFbZF0pLHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLlBqfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlBpfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmI7KGZ1bmN0aW9uKGMpe2Mud2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LHpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuem4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuQ2Mpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtCjE7YisrKTEwMDkhPXRoaXMuaGJbYl0mJjMwMyE9dGhpcy5oYltiXSYmNDAzIT10aGlzLmhiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy53a3x8d2I7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuSyhjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IHdiKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciB4Yj1jLnlrfHwKeGIseWI9bmV3IHhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMuTWp8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnZmPSExfSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zbigpfS5iaW5kKHRoaXMpLDUwMCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLApiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnZmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnZmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmCmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LG1vOmZ1bmN0aW9uKCl7dGhpcy52Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuaGt8fEFiOyhmdW5jdGlvbihjKXtjLmdrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5WbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudWN8fCh0aGlzLnVjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLnVjfHx0aGlzLnVjKyssdGhpcy51Yzw9dGhpcy5WbT8odGhpcy51YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuZ2t8fEJiOyhmdW5jdGlvbihjKXtjLmlrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuaWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLlFqfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5laz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5la3x8RmI7KGZ1bmN0aW9uKGMpe2MuZGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVGEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLndsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5NbSgpOnRoaXMuRmcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSx3bDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkliKCk7IWEucGEmJmEuWSYmYS5OcCYmYS5QcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEZnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCl9LmJpbmQodGhpcyksMTAwKX0sSWI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5JYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5UYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sanE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSWIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuZGt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbmw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTChhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLm5sKGFbYl0pO3RoaXMuTygpfX0pO2MuZ2QuSWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy5wcHx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuS2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0saHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sWmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVGE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLktqfHxYOyhmdW5jdGlvbihjKXtjLkpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLndmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMud2Y9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy53ZiYmYyE9dGhpcy53Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLlIoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLm9xKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmp8fFk7KGZ1bmN0aW9uKGMpe2MuTGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLkFmKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMuTGp8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5Wb3x8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5wanx8TmI7KGZ1bmN0aW9uKGMpe2Mub2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTT10aGlzLk18fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxDZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkNlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLm9qfHxPYjsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTmIoYVtiXSk7Yy5oYXx8dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgT2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFBiPWMucWp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmZrfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT8oYz1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuWml8fFNiOyhmdW5jdGlvbihjKXtjLiRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy4kaXx8VGI7KGZ1bmN0aW9uKGMpe2MuYWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGM9bmV3IFNiKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSx3aW5kb3cuYnJpZHBsYXllcj1jLChuZXcgVGIoYyx0aGlzLkYpKS5mKCkpfX10aGlzLk8oKX19KX0pKGMpO3ZhciBVYj1jLmFqfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMuV2t8fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSxhZTpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LEFuOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuQmt8fFhiOyhmdW5jdGlvbihjKXtjLkFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0sZ2M6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkhrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuSGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmdjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuRG4oKX0sRG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55bj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy55bj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmdjKGEpKX19KX0pKGMpO3ZhciBZYj1jLkFrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhLkFuKCksYT1uZXcgWWIoYSx0aGlzLkYpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFpiPWMuQ2t8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5rbnx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy4kbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLiRkKGEpfS5iaW5kKHRoaXMpKX0sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5xa3x8TjsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuT2UpaWYodGhpcy5PYnx8Cih0aGlzLk9iPTApLHRoaXMuT2IrKywxNTx0aGlzLk9iKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLlpuKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5NKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5NPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMucGt8fE87KGZ1bmN0aW9uKGMpe2Mucms9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuQWYoKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBiYz1jLnJrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5GbHx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Hanx8WjsoZnVuY3Rpb24oYyl7Yy5Gaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuTT10aGlzLk18fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuU2IoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy55YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx5YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTT1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRmp8fGFhOyhmdW5jdGlvbihjKXtjLkhqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuSGp8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLklvfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLm1qfHxoYzsoZnVuY3Rpb24oYyl7Yy5saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5FZygpfSxFZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMubGp8fAppYzsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLkwoYSk7KG5ldyBpYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGpjPWMubmp8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLnJwfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLklpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5CZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnphPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5CZS5iaW5kKHRoaXMpLDEwMCl9LEJlOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5IaXx8bmM7KGZ1bmN0aW9uKGMpe2MuSmk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxTYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBuYyhhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgb2M9Yy5KaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuTWl8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5PZD1bXTt0aGlzLnpmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy4kaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmZtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnpmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy56ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5PZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxmbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy56ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxvbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5PZC5sZW5ndGg7YSsrKXRoaXMuT2RbYV0uWmImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZFthXS5aYil9fX0pKGMpO3ZhciByYz0KYy4kanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkttPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy5LbXx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGsuTG8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGsuZW4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTmUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5kanx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLkxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi52YigibmV3QWRkZWxpdmVyeSIpfWMuS2k9YTthLnByb3RvdHlwZT17Vm46ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApSbjpmdW5jdGlvbihhKXt0aGlzLkxiPWF9LFFuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LCRjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnVtKCkpdGhpcy5MYi5nKHRoaXMuTGIuUWMsdGhpcy5MYi5xYSx0aGlzLkxiLnlmLGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTGIuaWMpO2Vsc2UgaWYobC5EYiYmIWwuR2kpbC5UbShmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhrLkhjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5xbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTGIsaCk7bS5Obih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmdmJiYoZD10aGlzLnBsYXllci5nZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5qZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx1bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LGZvOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuJGMoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX0sZW86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRmYoInBvc3Ryb2xsIik7Zi52YigicG9zdHJvbGwiKTt0aGlzLlZuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLiRjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxHbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmJvKHRoaXMuZW8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sVGQ6ZnVuY3Rpb24oYSl7Zi52YigibWlkcm9sbCIpO2YuRmYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy4kYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxGbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLlVuKHRoaXMuVGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubWYoKX0sZjpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLnBsYXllci5tZiYmdGhpcy5GbigpO3RoaXMuR24oKX19fSkoYyk7dmFyIGZhPWMuS2l8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy55anx8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGJhZXJhZUhpVGhlcmVpbmcsYmFlcmFlSGlUaGVyZWluZyk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.101.32
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-143-204-101-32.fra50.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 6944
|
0
0
|
35ms
35ms
|
Fetch
image/gif |
172.217.23.130
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstv44J-UIuWVL7nP8O40yVTXVJTjXNcZ8Qzqygkf2S4qJS1Uj809kbJrI7y0R5dNXiNLOmj-DUNfFavDPjvsdae7i5pzEWWOeSHr5h9I4-7a6qOx9Y8u46SGd3Pg1uO55fK1HWW7YgHLxqIvWMOYZYmFgf-mQurLMv1TPe7rid-S1nv1J3ms3B-m83wPoQFNVGTv9PXVn25PRYyy6TrXqntiIEyfvh0wKDZMfsBWki2p0sY2MgB2DE7LQul4fLrNvmgAII7TIdGpPujHyNdfQ&sig=Cg0ArKJSzMUB8zfMT3lYEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.130
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s18-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 6944
|
43 KB
14 KB
|
16ms
16ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 6944
|
73 KB
28 KB
|
15ms
14ms
|
Script
text/javascript |
2a00:1450:4001:814::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_2020022701.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 31eef561438773aa8905d73dfe2e8400eca13620146d6235c6e019a828bd33fe
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
5303510597
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
205 B
|
21ms
21ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.giga.de/e1d03b22f020f7405dc574d61c273302107da8f1/
Frame 73F9
|
807 B
2 KB
|
253ms
148ms
|
XHR
application/json |
5.9.139.135
HETZNER-AS
|
|
General
- Full URL
- https://ssl.2.damoh.giga.de/e1d03b22f020f7405dc574d61c273302107da8f1/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGJhZXJhZUhpVGhlcmVpbmc9YmFlcmFlSGlUaGVyZWluZ3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnRtKCkse2lkOmF9KX0sNTAwKTtpZihmLnBuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5SbihsKTtiLlFuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLlluKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlFpfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudm4uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnFoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnRqPWE7YS5wcm90b3R5cGU9e3BvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5xaFtiXSYmKHRoaXMucWhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5wbygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sU2s6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LHZuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLnVuKGIuZGF0YSl9LHVuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmgoYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZmg6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sUWs6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5PbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sT2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFlnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxGbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxlaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sJG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLiRuKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0semg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LAp6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPXo7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYSh6KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LHFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCx6PTA7ejxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeisrKSxnPWIuY2hhckNvZGVBdCh6KyspLHE9Yi5jaGFyQ29kZUF0KHorKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxBbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSx6PSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksej0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtSaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxybTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx6azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sSWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxrazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlJpKCl8fGIuWWkoKXx8Yi5ybSgpfHxiLlVqKCl8fGIuemsoKXx8Yi5JaigpfHxiLmtrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0sZ206ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LGhvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LCRnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnBuPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSx3bjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LGlvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMud24oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5GbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5lYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5lYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlFtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LFluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LHltOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnRqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnNqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eua3A9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5vcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuUW89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmNuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5scD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQ2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5nbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuanA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLk5vPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5lbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5zanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkptfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuY20oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy51anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLmdqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuYmo9YX0pKGMpO3ZhciBLPWMuYmp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5PaXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuU24oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LExuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxTbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkRoJiZMLm9vKGEpfSwkcDpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sem06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlpqfHxwOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sYm86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sVW46ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxacDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk1rKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApicTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxlcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFZwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5MaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy5YbT0zMDt0aGlzLmJjPVtdO3RoaXMubmI9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnhpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy5UbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnhpfHwodGhpcy54aT0hMCxmLmtmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxzbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnNtKCk7CmlmKCF0aGlzLndtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMubmIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5uYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm5iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksYT10aGlzLm5iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LFpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxUbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTGl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5OaXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaWp8fG9hOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5NcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmpqfHxwYTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMua2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkRrfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApO3RoaXMuVyhiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Eanx8c2E7KGZ1bmN0aW9uKGMpe2MuQ2o9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy50ZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGU9MDtlPApkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnJlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5YbSYmIXRoaXMueWEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTmQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMudGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5MZT90aGlzLkxlKys6dGhpcy5MZT0xOnRoaXMuS2U/CnRoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Danx8dGE7KGZ1bmN0aW9uKGMpe2MuRWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGU9MDtlPGIubGVuZ3RoO2UrKylhLnB1c2goYltlXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwplLndifHx0aGlzLksoZSl8fHRoaXMuem0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxYcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkxtfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy51az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwkZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGUpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnVrfHx4YTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy53aT0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5ibihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy55YigpKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuUigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9dGhpcy5PYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlJjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlJjfSx4bTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk9jKCksYj10aGlzLnZtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpe3RoaXMuRW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sRW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5SKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuUigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxXcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMueG0oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9jKCksYT10aGlzLlBjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5NPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmCmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZnE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/KHRoaXMudygpLHRoaXMuamEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55YSgpfHwoYXx8KHRoaXMud2k9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMud2ksZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHJsOmZ1bmN0aW9uKCl7dGhpcy5ncXx8KDEwPHRoaXMuV28/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMuV28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5LbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxLbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ybyl7dGhpcy5Ybz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksCjUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB5YT1jLnRrfHx5YTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5oaSh3aW5kb3cpOwpmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmhpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGhpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZGVvanMtcGxheWVyIikpJiZhLnBsYXllciYmYS5wbGF5ZXIucGxheWVyJiYoYT1hLnBsYXllci5wbGF5ZXIoKSxiLnB1c2goYSkpO2lmKDA8Zi5TZShiKSl7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmKGE9bmV3IHhhKGJbZV0pLGEuaGF8fHRoaXMuSyhhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgeWEoYSx0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuWmI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMudmt8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLnRmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5VKCk7CnJldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0scm46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fGIuTmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLnRmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCnVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE1hOmZ1bmN0aW9uKCl7fSwkZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLk9iKyssMTU8dGhpcy5PYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLk9lPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGU9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9CiEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLkJhKCk7CnZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuS2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLktsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Eucm4oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBSKGFbYl0pO2UuaGF8fHRoaXMuSyhlKXx8KHRoaXMuTChlKSwobmV3IENhKGUsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuWGt8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmVoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudG49YS5wb3NpdGlvbmluZzt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnN0eWxlLndpZHRoPWEud2lkdGg7ZS5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2Uuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtlLnN0eWxlLmhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1heEhlaWdodD0KYS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy50bil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTt0aGlzLkNkPWV9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5DZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQ2QpfSxsYTpmdW5jdGlvbigpe3JldHVybiEwfSxxbDpmdW5jdGlvbigpe2YuemgodGhpcy5DZCk7Zi5hZih0aGlzLkNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCmdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5Banx8R2E7KGZ1bmN0aW9uKGMpe2Muemo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhOyhmdW5jdGlvbihjKXtjLkJqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1mLmVoKGEsImVsZW1lbnRJRCIpO2lmKGYuemgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5LKGEpKSl7dGhpcy5MKGEpOyhuZXcgSWEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLkJqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5Wa3x8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnZqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sTms6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy52anx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCwKZyxjKXt0aGlzLkZhPWI7dGhpcy5aZz10aGlzLkZpPSExO3RoaXMuTGg9ZDt0aGlzLmlpPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmtiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbCYmbC5kZih0aGlzLkZhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2cmJjQhPWgucmVhZHlTdGF0ZSYmZyhoKX0uYmluZCh0aGlzKX1jLndqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhLmRhdGE7aWYoInN0cmluZyIhPQp0eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy5aZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5rYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5rYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmtiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuRml8fCh0aGlzLmtiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5rYi5zZW5kKGIpfWNhdGNoKGcpe2I9dGhpcy5GYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8CnRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTGgmJnRoaXMuTGgoKX1yZXR1cm4gdGhpcy5rYn19fSkoYyk7dmFyIE1hPWMud2p8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuY2o9YTthLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYil7dGhpcy5tZT1ifSxXbjpmdW5jdGlvbihiKXt0aGlzLkdhPWJ9LEluOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3ZwOiJBZENsaWNrVGhydSIseHA6IkFkRXJyb3IiLHlwOiJBZFN0b3BwZWQiLEJwOiJBZExpbmVhckNoYW5nZSIsQ3A6IkFkVGFnUGFyc2VkIixGcDoiQWRWaWRlb0NvbXBsZXRlIixJcDoiQWRMb2FkZWQiLApKcDoiQWRTa2lwcGVkIixLcDoiQWRTdGFydGVkIix6cDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEFwOiJBZEltcHJlc3Npb24iLHdwOiJBZENyZWF0aXZlVmlldyIsRHA6IkFkVmlkZW9NaWRwb2ludCIsRXA6IkFkUGF1c2VkIixHcDoiQWRWaWRlb1N0YXJ0IixIcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLm1lLGFbZF0pfSxIbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuR2EmJnRoaXMuR2EubGUpZm9yKHZhciBhIGluIHRoaXMuR2EubGUpdGhpcy5HYS5sZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkdhLHRoaXMuR2EubGVbYV0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuR2EuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwKMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5JbigpO3RoaXMuR2EmJnRoaXMuSG4oKX19fSkoYyk7dmFyIE5hPWMuY2p8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnBiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLm9iPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjt0aGlzLmVmPSExO3RoaXMucWE9dGhpcy5RYz0iIjt0aGlzLiRlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnlmPSExO3RoaXMuaWE9W107dGhpcy5XZT10aGlzLlZiPSIiO3RoaXMuamU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5pZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMubGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuYWM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2I9IiI7dGhpcy5YYj0KW107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmliPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmFiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkhkPTA7dGhpcy5waD0hMTt0aGlzLm9oPTFFMzt0aGlzLkVjPSExO3RoaXMuUGE9MUUzO3RoaXMua2Q9dGhpcy5sZD0iIjt0aGlzLkRiPW51bGw7dGhpcy5HaT0hMTt0aGlzLlljPXRoaXMuUWQ9bnVsbH1jLnhqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkNhLGFkdGFncGFyYW1ldGVyOnRoaXMucGIsYWR0YWdtb2RpZmllcjp0aGlzLm9iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5lYyxhZHRhZ3JlZ2V4OnRoaXMucWQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuZmYsCnNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLHNlcnZlcjp0aGlzLmlhLHN2bUNvbmZpZzp0aGlzLlZiLGhvbWFkQWRwYXRoOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5qZSxIT01BRF9CTE9DS0VEOnRoaXMuaWUsSE9NQURfTk9CTE9DS0VSOnRoaXMubGIsSE9NQURfQURCTE9DS0VSOnRoaXMuYWMsdGVzdEhpZGU6dGhpcy5XYix0ZXN0VGFnczp0aGlzLlhiLHRlc3RUYWdzSlM6dGhpcy5ZYix0ZXN0VGFnc1hIUjp0aGlzLmJkLHRlc3QzUENvb2tpZTp0aGlzLnRjLHRocm90dGxlOnRoaXMuWmQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5uYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmFiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5iYix2cGFpZDp0aGlzLmliLHNraXBBbGxvd2VkOnRoaXMuTGYsdm1hcHM6dGhpcy5hZyxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuRWMsYWRGYWxsYmFja1VSTDp0aGlzLmxkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5rZCx5aWVsZGxhYjp0aGlzLkRifX0sUG46ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMucGI9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYKKHRoaXMub2I9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuZmY9Yi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLnpiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuVGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmVmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLlFjPWIuZ2xvYmFsQ29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuJGU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5pYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlZiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5XZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5qZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJgoodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5sYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYodGhpcy5XYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5YYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlliPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuYmQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnRjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5aZD1iLnRocm90dGxlKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuSGc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMueGM9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5zZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5XZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLmJlPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYWI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmKHRoaXMuYmI9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5pYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5MZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5hZz1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkVjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LG9tOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYWJbYV0mJjE9PXRoaXMuYWJbYV0mJihiPSEwKTtyZXR1cm4gYn0sRWY6ZnVuY3Rpb24oYil7dGhpcy5hYltiXT0hMH0sWWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuYWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5hYlthXSYmMT09dGhpcy5hYlthXSYmYi5wdXNoKGEpO3JldHVybiBifSxYZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9Zi4kayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBnPSIiLGM9IiIsZj0iIixoPSIiO2lmKCF0aGlzLkNhJiYhYSlyZXR1cm4gbmV3IEMoYik7Zz10aGlzLmNmKGIpO2M9dGhpcy5hYShiKTtnPyh0aGlzLlNjKCk/Zj1iOmY9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZj10aGlzLnFjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMucGJ8fHRoaXMub2J8fAp0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5abShoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLiRsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sY2Y6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlNjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LGRmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuY2YoYik7cmV0dXJuIGF9LCRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLlJwOwpyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxIaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGcpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxZbTpmdW5jdGlvbihiLGEpe3ZhciBkPWYuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPApoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5IaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPXRoaXMuSGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Z31sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBnPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxabTpmdW5jdGlvbihiKXt0aGlzLnBiJiYoYis9dGhpcy5wYik7aWYodGhpcy5vYilmb3IodmFyIGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm9iW2FdKSk7aWYoZi5KYylmb3IodmFyIGQ9MDtkPGYuSmMubGVuZ3RoO2QrKyl7dmFyIGc9CmYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuWW0oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmYS5YbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuV24oYi5wbGF5ZXIpO2EuZigpfX0sZzpmdW5jdGlvbihiLGEsZCxnLGMsZil7bD10aGlzO3RoaXMuZWY9ITA7dGhpcy5RYz1iO3RoaXMucWE9YTt0aGlzLnlmPWQ7dGhpcy5lZT1nO3RoaXMuaWM9Yzt0aGlzLnhhPWZ8fHt9O3RoaXMucGwoKTt0aGlzLlBtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnFhKXRoaXMuTm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuR2MoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LENsOmZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQ9ITE7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxQbTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5RYyt0aGlzLnhlKCJnbG9iYWwiKSksdGhpcy5tbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkdjKCl9LmJpbmQodGhpcyksITApfSxObTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5xYSt0aGlzLnhlKCJjbGllbnQiLAotMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuU2IoKSk7dGhpcy54YSYmdGhpcy54YS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YiYmKGQ9IiIpO3RoaXMueGEmJnRoaXMueGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5zZCl7dGhpcy5zZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZSl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0KITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuJGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTt0aGlzLkJiKCk7Zi5MYyhrLnFuKTsoYT1mLlVhKHRoaXMuSWQoKSkpfHwoYT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxtbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZz0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmCihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihhLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnFhfHx0aGlzLlZifHx0aGlzLkFhfHx0aGlzLkdjKCk6KHRoaXMuQ2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5CYigpKX19LEdjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7CnRyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGQuc2VydmVyLmxlbmd0aDthKyspe3ZhciBiPWQuc2VydmVyW2FdO3RyeXt2YXIgZTsoZT12b2lkIDA9PT1iKXx8KGU9IWIucmVwbGFjZSgiW2hhc2hdIix0aGlzLkpmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpKS5tYXRjaChSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSkpO2lmKGUpcmV0dXJuITF9Y2F0Y2goZyl7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9CihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChmLlIoIndlYi5kZSIpfHxmLlIoImdteC5uZXQiKXx8Zi5SKCJnbXguYXQiKXx8Zi5SKCJnbXguY2giKXx8Zi5SKCIxdW5kMS5kZSIpKSYmIXRoaXMuU2MoKSlmb3IoYj0wO2I8dGhpcy5pYS5sZW5ndGg7YisrKXRoaXMuaWFbYl09dGhpcy5pYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8CiExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJnRoaXMuQWEmJnRoaXMuaWEubGVuZ3RoP3RoaXMuVGMoITEpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5sYikpLHRoaXMuQmIoKSl9LGNpOmZ1bmN0aW9uKGEpe3RoaXMubGR8fCh0aGlzLmxkPWF8fCIiKX0sVGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUyl7dmFyIGU9e307aWYoYSl7dmFyIGU9bmV3IEModGhpcy5xYygpKSxkPXRoaXMuYWEodGhpcy5WYik7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtlLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2UubWV0aG9kPSJQT1NUIn1lbHNlIGU9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGUsdGhpcy5yby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTthP3RoaXMuams/dGhpcy5zYSgibm9TVk1Db25maWciKToodGhpcy5qaz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuVGMoITApfS5iaW5kKHRoaXMpLCEwKX19LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBlPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtpZighdGhpcy5uYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubmM9ITA7dGhpcy5UYyghMCk7cmV0dXJufX1lPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZT0hMCl9Y2F0Y2goaCl7fWlmKCEoZXx8CmQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2EucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5XZj10aGlzLkFiKGQuc3RyaWN0KTt0aGlzLmJlPXRoaXMuQWIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuU2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmJiPXRoaXMuQWIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkFiKGQuZW5hYmxlZCk7dGhpcy5XYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlliPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuYmQ9ZC50ZXN0YWR0YWdzeGhyfHwKW107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5wYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLm9iPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5xZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5mZj1kLmpzcG9wdXBzfHwhMTt0aGlzLnpiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLmliPWQudnBhaWR8fCExO3RoaXMueGEudnBhaWQ9dGhpcy5pYjt0aGlzLkxmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMudGQ9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmFnPWQudm1hcHN8fCIiO3RoaXMuRWM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlpkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307dGhpcy5EYj0KZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuQ28oKSYmKHRoaXMuV2J8fHRoaXMuWWJ8fHRoaXMuWGJ8fHRoaXMuYmQpP3RoaXMueWY/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5FZSgpLHRoaXMuQmIoKSk6dGhpcy51bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlRmKCkpfX0sVG06ZnVuY3Rpb24oYSl7dGhpcy5HaT0hMDt2YXIgZT1mdW5jdGlvbihhKXtpZihhPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnwgKSIrYSsiPShbXjtdKykiKSkpcmV0dXJuIGFbMl19KCJhZHBfc2VncyIpfHwiZTAiLGU9dGhpcy5EYi51cmwucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltzZWdzXSIsCmVuY29kZVVSSUNvbXBvbmVudChlKSksZT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6ZSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLnFiKGUpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07Zi5LZCh0aGlzLnFjKCksIlBPU1QiLGUsZnVuY3Rpb24oZSl7dHJ5e3ZhciBnPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe31mLnRyYWNrKCJzdGF0c19oZF95bF9kYXRhIiwhKCFnfHwhZy5sZW5ndGgpLCEwKTt0cnl7aWYoZyYmZy5sZW5ndGgmJnRoaXMuRGIucGFyYW1ldGVyKXt2YXIgaD10aGlzLkRiLnBhcmFtZXRlci5zcGxpdCgiW2lkXSIpLmpvaW4oZ1swXS5pZHx8IjAiKSxoPWguc3BsaXQoIltwcmljZV0iKS5qb2luKGdbMF0ucHJpY2V8fDApO3RoaXMucGIrPWh9fWNhdGNoKEIpe2EoKX1hKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthKCl9LmJpbmQodGhpcyksITApfSx1bzpmdW5jdGlvbigpe3RoaXMudG8oKTt0aGlzLnZvKCl9LAp2bzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGU9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cud2lkdGg9MTtnLmhlaWdodD0xO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1mLlYoMTApLGg9Zi5WKDEwKSxCPWYuVigxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJkYXRhIiwiIil9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShCKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZi5xYihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGcpfWNhdGNoKGEpe31pZigzIT0KZCl7dmFyIGI9Zi5CZCgpO2lmKChiLmlzQ2hyb21lfHxiLmlzRmlyZWZveCkmJiFiLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsZSwhMCk7cmV0dXJufXRoaXMuc2EoImNzcF8iK2UpfWYudHJhY2soInN0YXRzX2hkX2NzcCIsZSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFRmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxZZDpmdW5jdGlvbihhKXt0aGlzLnhjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkNhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYihhKSksdGhpcy5CYigpLHRoaXMuRWUoKSl9LHRvOmZ1bmN0aW9uKCl7aWYodGhpcy5XYil7dmFyIGE9Zi5CZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuQ20oKSl0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTtlLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZD0wPT09ZS5vZmZzZXRXaWR0aHx8MD09PWUub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSk7YT1kfWNhdGNoKGcpe31hP3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMubGkoKX19ZWxzZSB0aGlzLmxpKCl9LFJmOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPQpkLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy55byhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlhiPXRoaXMuYmQpJiZ0aGlzLlhiLmxlbmd0aCl7dmFyIGQ9dGhpcy5YYi5zbGljZSgpLGc9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LHlvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gYygpe3JldHVybiBmPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGYpLCEwKTohMX12YXIgZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0aGlzLkthKG5ldyBDKGEpLGcsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxsaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz0KZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuem8oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuWWImJnRoaXMuWWIubGVuZ3RoKXt2YXIgZD10aGlzLlliLnNsaWNlKCksZzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUmYoKX0sem86ZnVuY3Rpb24oYSxlLGQpe2Z1bmN0aW9uIGcoKXtmKCkmJmUoKX1mdW5jdGlvbiBjKCl7ZigpJiZkKCl9ZnVuY3Rpb24gZigpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZSxkKXtkPT1hJiZmKCkmJgpjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtnKCl9fSxRZjpmdW5jdGlvbigpe2lmKHRoaXMudGMpdHJ5e2YuS2QodGhpcy50YywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5IYj0hdGhpcy5BYihhLmNjKTt0aGlzLlRmKCl9LmJpbmQodGhpcyksdGhpcy5qaS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmppKCl9ZWxzZSB0aGlzLlRmKCl9LGppOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpO3RoaXMuRWUoKX0sQ206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sCkJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMueGMmJihlPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2UsITApO3RoaXMuQ2EmJnRoaXMuaXNFbmFibGVkJiZ0aGlzLlFkJiZ0aGlzLmNsKCk7dGhpcy50YyYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkhiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5qZSkpO3RoaXMuZWUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZSYmdGhpcy5lZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5IYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuWWM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ZYy5pZD1mLlYoMTApO3RoaXMuWWMuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLlljKTt2YXIgYT10aGlzLlljLmNvbnRlbnRXaW5kb3csZT0KYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD1mdW5jdGlvbigpe2Zvcih2YXIgZSxnPTA7Zzx0aGlzLlFkLmxlbmd0aDtnKyspZT1hLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGUudHlwZT0idGV4dC9qYXZhc2NyaXB0IixlLnNyYz10aGlzLlFkW2ddLGEuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX0uYmluZCh0aGlzKTtlLnNyYz1mLkFlKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZSk7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZi50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sb2w6ZnVuY3Rpb24oKXtpZih0aGlzLmJlJiZ0aGlzLm9tKCkpe3ZhciBhPQp0aGlzLllsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZSl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZSxkLGcsYyxoKXt0aGlzLkhkfHwodGhpcy5IZD0wKTt0aGlzLkhkKys7dGhpcy5IZD50aGlzLm9oJiYhdGhpcy5waCYmKHRoaXMucGg9ITAsZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLm9oLCEwKSk7YT1uZXcgTWEoYSxlLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpO2cmJihhLkZpPSEwKTtjJiZmLkFtKCkmJihhLlpnPSEwKTtoJiYKKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLldtfHwodGhpcy5XbT0hMCxmLkRhKCl8fGYuZWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhlPWEucmVzcG9uc2VYTUwpfHwoZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJmcuY2hpbGROb2Rlc1swXT9nLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOgoiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGUpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoZSk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsCmcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LHNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmFnfSxtbDpmdW5jdGlvbigpe3RoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuS2EoYSx0aGlzLlBvLmJpbmQodGhpcyksdGhpcy5Pby5iaW5kKHRoaXMpKX0sClBvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5KbCgpfSxPbzpmdW5jdGlvbigpe30sSmw6ZnVuY3Rpb24oKXtmLkxjKGsuSWwpO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09ZS50eXBlJiZmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09ZS50eXBlKXt2YXIgZD1uZXcgSTt3aW5kb3dbZC5nYSgpXT0KdGhpcztmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LENvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWmR9LFNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGU9IiIsZD0wO2Q8YTtkKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGV9LEFiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0iIixkLGcsYyxmLGgsayxsPTA7bDxhLmxlbmd0aDspZD0KYS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZT1lKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBlfSxhYTpmdW5jdGlvbihhKXt2YXIgZT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtlW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixlKXtiJiYoZC5xdWVyeUtleVtiXT1lKX0pO3JldHVybiBkfSxKZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBlKGEpe3ZhciBiPSIiLGUsZDtmb3IoZT03OzA8PWU7ZS0tKWQ9YT4+PjQqZSYxNSxiKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGcsYyxmPUFycmF5KDgwKSwKaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChnKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKylmW2ddPWQoZltnLTNdXmZbZy04XV5mW2ctMTRdXmZbZy0xNl0sMSk7Yz1oO249aztwPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZwfH5uJnIpK3UrZltnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnB8biZyfHAmcikrdStmW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTYwOzc5Pj1nO2crKyl2PWQoYyw1KSsobl5wXnIpK3UrZltnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLApjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihlKGgpK2UoaykrZShsKStlKG0pK2UodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnhqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLlVrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSxkKXt0aGlzLmE9YTthLmMuUD90aGlzLmdiPWEuYy5QKCk6dGhpcy5nYj0iIjthLmMud2gmJmEuYy53aCh7cGF1c2U6dGhpcy5OZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLiRoLmJpbmQodGhpcyksbXV0ZTp0aGlzLm9mLmJpbmQodGhpcyksCnVubXV0ZTp0aGlzLkpvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEuc2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5qYz10aGlzLnJkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9ZTt0aGlzLmpiPXt9O3RoaXMudmlkZW89e307dGhpcy5WZD17fTtmLnZiKCJuZXdCaWdBZElkIik7dGhpcy5ibD1mLlYoMTApO3RoaXMuTmY9MDt0aGlzLm9kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMub2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMub2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuVGs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5XYz10aGlzLlVkPSExO3RoaXMuRmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy53ZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMub2M9ITE7dGhpcy56bD1mLlYoMTApO3RoaXMuUmI9Zi5WKDEwKTt0aGlzLlBiPWYuVigxMCk7dGhpcy5laT1mLlYoMTApO3RoaXMuY29uZj17fTt0aGlzLmZlPXRoaXMuJGI9dGhpcy5JZT10aGlzLnlkPXRoaXMuV2Q9dGhpcy5DYj10aGlzLnZjPXRoaXMuT2g9dGhpcy5IZT10aGlzLkRkPXRoaXMuRG89dGhpcy5GYj10aGlzLlFiPSExO3RoaXMuQWM9W107dGhpcy5wYz17fTt0aGlzLm1uPTIwMDt0aGlzLmRnPXRoaXMuZGQ9dGhpcy5GYz10aGlzLmNnPXRoaXMueGY9ITE7dGhpcy5xZj17fX1jLnJqPWE7YS5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihlPQp0aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBlfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5OYiYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMua28oKTtmLm8oay5Layx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqZjpmdW5jdGlvbihhLGUsZCxnKXt0aGlzLkZiPWQ7dmFyIGM9ITE7ZyYmZy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGM9ITApO2lmKHRoaXMuQS5TKXRoaXMuTmYrKyxmLnZiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxnPWwuZ2V0Q29uZmlnKCksZi5PZyYmKHRoaXMuQS5Qbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5BLkNhJiZ0aGlzLkEuaXNFbmFibGVkPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCwKa2VlcFVSTDplLGJpdHJhdGU6Zy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5pYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTplPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaWIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpnLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5RYSgpO2Vsc2V7dmFyIGg9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmNvKHRoaXMuYik7dGhpcy5raChhKTt0aGlzLkFjPXRoaXMuYWgoYSk7dGhpcy5zbCgpfSxraDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmltKGIpKSx0aGlzLmtoKGIucGFyZW50KSl9LGFoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5haChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlRsKGIpKSk7cmV0dXJuIGV9LFRsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLmtwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmNuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5IbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMubG8oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Rbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsubHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5vcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLk1vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLk5vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sY286ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuamIuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS5ycT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlRrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk9rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5taShlKSl7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5SayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmpiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuamIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuYW8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sYW86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuU2sodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5QaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMueWkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLmxtKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5abygpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuQ2ksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5jcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaHAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZ3AoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5pcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5lcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5EaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGUpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmFwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LCRvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0sYXA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sYnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LFpvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuZ2koKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxncDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxpcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LERpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LFlvOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsuanAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkRpKCEwKX0sT2s6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBlPWIuYWEoYSk7cmV0dXJuIGUucHJvdG9jb2wrIjovLyIrZS5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLlVvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbWk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFJrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5CaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQWk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm1pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlNvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLlJvKCk7dGhpcy55aSgpO3RoaXMuQmcoKTt0aGlzLmEuUGgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5kaSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuYmImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LExrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZmgoYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5pbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuTGsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5nbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuamIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS52aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlloKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkloKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sVW86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQmk6ZnVuY3Rpb24oKXtpZih0aGlzLkRvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5HbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5DaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmpiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLnZpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxzaTpmdW5jdGlvbigpe3RoaXMuT2h8fCh0aGlzLk9oPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxHbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudGl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnNpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuZ2koKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5iYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy50aT1hKX0sZmk6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxrbzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sZ2k6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LGxvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5iYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5iYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLnltKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGUpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkRsKHRoaXMuYi5PYSxhKX1jYXRjaChCKXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5OayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLlBrKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5YaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxQazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFhoOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sbm86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sam06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxEbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxTbzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy56aS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnppLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sUm86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuJGcoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm5pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Fby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5laTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LG9pOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LEVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sRm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxKbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuSG0oKSYmdGhpcy5HbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLkhvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LEhtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuaWJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5pYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5pYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxHbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sWmw6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LEhvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmlmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7fXRoaXMueGQoKX12YXIgZT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMsZD10aGlzLlpsKCk7dGhpcy5GYz10aGlzLldjPXRoaXMuZGQ9dGhpcy5kZz0hMDtyZXR1cm4gZT8oZi5lYigiaHR0cHM6Ly93d3cud2VsZWN0LmRlL2FwaS92MS9wcmVmbGlnaHQvYnlfYWxpYXMvIitlLCJkZXdlbGVjdHd3d3dlbGVjdGRlIix7fSxhLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpLHRoaXMuQSksITApOiExfSxMZzpmdW5jdGlvbihhKXt0aGlzLm5vKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZyghMCl9LmJpbmQodGhpcyksCnRoaXMubW4pOih0aGlzLldkPSEwLHRoaXMuYS5WZSgpLHRoaXMuYS5NbigpLHRoaXMub2M9ITEsYT10aGlzLmIuc3x8e30sdGhpcy5IZXx8KGEubm9Db21wbGV0ZVF1YXJ0aWxlPSEwKSxmLm8oay55bCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMuUmUoKS5ZaCgpKX0sUmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZi5hZih0aGlzLnZpZGVvLGEpP3RoaXMuJGgoKTp0aGlzLk5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIucmIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuRWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmCihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuQWMmJjA8dGhpcy5BYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuQWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sdTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYmwrIi0iK3RoaXMuTmY7dGhpcy5iJiZ0aGlzLmIuZ2gmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLmdoKCkpO3JldHVybiBhfSxSZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMucmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMucXB8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsZCxjKXt0aGlzLm9wdGlvbnM9Y3x8e307ZT1kO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm9hPW51bGw7dGhpcy5ZPVtdO3RoaXMuSj1udWxsO3RoaXMuemM9dGhpcy5CYz0hMTt0aGlzLmJhPSIiO3RoaXMuYmc9ITE7dGhpcy5yaD0iIjtjJiZjLmVtcHR5P3RoaXMuU20oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxlLGQ9W107Yy5zaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpLGI7Yj1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBlPSIiO2IucXVlcnlLZXkmJihlPWIucXVlcnlLZXkuaHZwKTtlJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBDKHRoaXMudXJsKTpsLnZhKGwuWGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7CnZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52cGFpZCYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfS5iaW5kKHRoaXMpLGM9ZnVuY3Rpb24oKXtyZXR1cm4gZCgpJiYoZi5SKCJtYXJ0aGFzdGV3YXJ0LmNvbSIpfHxmLlIoImZhbmRvbS5jb20iKXx8Zi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKX0uYmluZCh0aGlzKTtpZihkKCl8fGMoKSl7dmFyIGg9Zi5OZyh0aGlzLnVybCk7aHx8KGg9dGhpcy51cmwpO3ZhciBjPWZ1bmN0aW9uKCl7cmV0dXJuIDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4gMDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksbT1mdW5jdGlvbigpe3JldHVybihmLlIoImdpZ2EuZGUiKXx8Zi5SKCJraW5vLmRlIil8fGYuUigic3BpZWxldGlwcHMuZGUiKXx8Zi5SKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbj1mdW5jdGlvbigpe3JldHVybiAwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil8fDA8aC5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfS5iaW5kKHRoaXMpO2lmKGMoKXx8aygpfHxtKCl8fCJhcHBzcG90Ij09ZSluKCk/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5YZChoKSkrIiZ0eXBlPWpzIixiPWwudmEobC5YZCh0aGlzLnVybCksCiExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGYudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPWwudmEobC5YZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLlJtLmJpbmQodGhpcyksdGhpcy5PbS5iaW5kKHRoaXMpKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMub2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmCmEuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09Zi5OYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZVtiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goYyl7ZVtiXT17fX1lbHNlIGUuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZT1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSwKYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWYuTmJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1mLk5ifHx0aGlzLkVtKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLnNvKCkpdHJ5e3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1jLmxlbmd0aCYmKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrY1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1nLmZpcnN0Q2hpbGQ7ZS5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksCmI9MDtiPGEubGVuZ3RoO2IrKyllLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGUpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LEVtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sZT10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrCjYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9ZT8hMDohMX0sUm06ZnVuY3Rpb24oYSl7dGhpcy54bihhKTt0cnl7dGhpcy5vYT1hLnJlc3BvbnNlWE1MLHRoaXMub2F8fCh0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5yaD1hLnVybENhbGxlZDtpZih0aGlzLlkubGVuZ3RoKXRoaXMuVmMoKTtlbHNle3RoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKTt0cnl7Zi50cmFjaygic3RhdHNfaGRfbXR5dXJsIixmLlVhKHRoaXMuYmEpLCEwKX1jYXRjaChlKXt9fX0sU206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMub2F8fAoodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5ZLmxlbmd0aD90aGlzLlZjKCk6dGhpcy5yYSh0aGlzLlJhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5uZTpGLmdnfSkpfSxPbTpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5SYSh2LmZnLHtkZXB0aDpifSkpfSxWYzpmdW5jdGlvbigpe3RoaXMuSj10aGlzLlkuc2hpZnQoKTt0aGlzLkltKCk/dGhpcy5BbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLmxoKCksZSx7QWRTeXN0ZW06dGhpcy5TbCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuUmEodi5pZykpOihiPTAsdGhpcy5LbygpJiZ0aGlzLnVmKHRoaXMuQmwoKSkpfSxwZjpmdW5jdGlvbigpe3RoaXMuQmM/KHRoaXMuQmM9MTx0aGlzLlkubGVuZ3RoLAp0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LnBmKCl9LEloOmZ1bmN0aW9uKCl7dGhpcy56Yz8odGhpcy56Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5JaCgpfSxLbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhvKCk/dGhpcy53bygpPyEwOigtMSE9dGhpcy5OYygpP3RoaXMucmEodGhpcy5SYSh2LmhlKSk6dGhpcy5yYSh0aGlzLlJhKHYuZWcpKSwhMSk6KHRoaXMucmEodGhpcy5SYSh2LmZkLEYuaGcpKSwhMSl9LHVmOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmdlfHwoYS5nZT1bXSk7YS5nZS5wdXNoKHRoaXMucmgpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5sZigpKTthLkViPWEuRWI/YS5FYjp0aGlzLkJjO2EueWM9YS55Yz9hLnljOnRoaXMuemM7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT8KYS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzt0aGlzLnBhcmVudC51ZihhKX0sQmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZHVyYXRpb249dGhpcy5OYygpO2EuTj10aGlzLmloKCk7YS5yYj10aGlzLlVsKCk7YS55cT1bXTthLm9yaWdpbj10aGlzO2Eucz10aGlzLlJsKCk7YS5NZj10aGlzLmhtKGEuZHVyYXRpb24pO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztyZXR1cm4gYX0scmE6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPQphLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7aWYoIXRoaXMuSiYmdGhpcy5vYSYmdGhpcy5vYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLm9hO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGU9ITE7KGU9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZS5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuT2E9YS5lcnJvci5jb2RlIT12LmhlLmNvZGU/YS5PYS5jb25jYXQodGhpcy5WbCgpKTphLk9hLmNvbmNhdCh0aGlzLmRtKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQua2MmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5rYyYmdGhpcy5wYXJlbnQua2MoYSksYj0wLHRoaXMuVmMoKSk6KHRoaXMucGFyZW50JiYKdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sa2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQua2MoYSl9LFVnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLlJhKGEsYikpfSxSYTpmdW5jdGlvbihhLGIpe3ZhciBlPW5ldyBUYShhLGIpO2Uub3JpZ2luPXRoaXM7cmV0dXJuIGV9LEFvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmloKCkubGVuZ3RofSx3bzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuTmMoKX0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxraTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuU2YoKSYmCihhPSEwKTtyZXR1cm4gYX0seG46ZnVuY3Rpb24oYSl7dGhpcy5iYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLmJhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuYmE9IlVOS05PV04ifXRyeXt0aGlzLmJnPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGUpe319LEltOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5saCgpLmxlbmd0aH0sbGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSxTbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBkPWFbZV07W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7dHJ5e2lmKCJUcmFja2luZyI9PWQmJmEmJmEucGFyZW50Tm9kZSYmIlRyYWNraW5nRXZlbnRzIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lJiYoYS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJOb25MaW5lYXJBZHMiPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZXx8YS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJDb21wYW5pb24iPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpcmV0dXJufWNhdGNoKGUpe31pZihhJiYhdGhpcy55aChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy50YihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LHloOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT0KYS5ub2RlTmFtZT8hMDp0aGlzLnloKGEucGFyZW50Tm9kZSk6ITF9LGRtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxVbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxpaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKWIucHVzaCh7aWQ6YVtlXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2VdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbZV0uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtlXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksCmhlaWdodDphW2VdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksU3A6YVtlXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMudGIoYVtlXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUGF8fDFFMzt0cnl7dmFyIGM9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlBhKS1NYXRoLmFicyhkLWIuUGEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWMuY29uY2F0KGYpfWNhdGNoKGgpe31yZXR1cm4gYn0sUmw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGU9ITEsZD1bXSxiPSExLGM9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Yz1iPXRoaXMuR2QoYVtoXSk7dHJ5e2U9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtlPWJ9ZC5wdXNoKGUpO2YucHVzaChjKX0xPGEubGVuZ3RoPyhiPWQsaD1jKTooYj1lLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMudGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxobTpmdW5jdGlvbihhKXt2YXIgYj0hMSxlPSExLGQ9ITE7dHJ5e2U9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWUuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1mLmhvKGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGMpe2I9ITF9cmV0dXJuIGJ9LFFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy50YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sVGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuR2QoYSk6IiJ9LEdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuVGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLnNrfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuUGx8fFVhO25ldyBVYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTj1bXTt0aGlzLnJiPSIiO3RoaXMucz10aGlzLnljPXRoaXMuRWI9ITE7dGhpcy5YZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuWWU9IiJ9Yy5Zaj1hO2EucHJvdG90eXBlPXt2bDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk4ubGVuZ3RoO2UrKylpZigwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxibTpmdW5jdGlvbigpe2lmKCF0aGlzLlhlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ub2Epe3ZhciBhPXRoaXMub3JpZ2luLm9hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxlPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKykoZT1hW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWUuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuWGU9YVtkXSl9cmV0dXJuIHRoaXMuWGV9LApnaDpmdW5jdGlvbigpe2lmKHRoaXMuWWUpcmV0dXJuIHRoaXMuWWU7dmFyIGE9IiI7KGE9dGhpcy5ibSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuWWU9YX0sbG06ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk5bZV07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLllqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLmFsfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt2YXIgdj17b2U6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsTmE6IlhNTF9QQVJTRV9FUlJPUiJ9LGVnOnt0eXBlOiJlcnJvciIsY29kZToyMDIsCm1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTmE6IkRVUkFUSU9OX0VSUk9SIn0sZmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE5hOiJFTVBUWV9WQVNUIn0saWc6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTmE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LGZnOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApOYToiTE9BRF9FUlJPUiJ9LGtlOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixOYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LHNwOnt0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE5hOiJNRURJQUZJTEVfRVJST1IifSxoZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixOYToiRFVNTVlfQUQifX0sRj17Z2c6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixOYToiTk9fQURTIn0saGc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE5hOiJOT19NRURJQUZJTEVTIn0sdHA6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE5hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sbmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTmE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2E9Yy5HbHx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmVycm9yPWE7dGhpcy5BZD1lO3RoaXMuT2E9W107dGhpcy5vcmlnaW49bnVsbH1jLmhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5oanx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWGE9CmMubGt8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5aaD1hO3RoaXMudmlkZW89ZTt0aGlzLmNlPVtdO3RoaXMuV2g9W107dGhpcy5yZj1bXTt0aGlzLlRvPSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5JKCl9Yy51cD1hO2EucHJvdG90eXBlPXtJOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLlpoLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuWmhbYV0sZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCwKYz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7dmFyIGg9Zi5jb250ZW50V2luZG93O2gubnE9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuSm4uYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuQ24uYmluZCh0aGlzKX07dmFyIGs9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7ay5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Euc3JjPWQ7aC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2guZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTsKdGhpcy5jZS5wdXNoKHtzcmM6ZCxmcmFtZTpmLG5uOmMsdmVuZG9yOmUuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLnJmLmxlbmd0aDtlKyspe3ZhciBkPXRoaXMucmZbZV07ZC50eXBlPT09YSYmZC5mbCh0aGlzLldsKGEpKX19LFdsOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e3dxOiEwLHZxOjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e2txOiJ2aWRlbyIsenE6ImpzQ3VzdG9tIixBcToiMS4wLjAtZGV2In19O2Nhc2UgInN0YXJ0IjpyZXR1cm57dHlwZToic3RhcnQiLGRhdGE6e2R1cmF0aW9uOjEwLEJxOjEsVHA6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIiwKZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sa206ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLmNlLmxlbmd0aDtlKyspaWYodGhpcy5jZVtlXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLmNlW2VdLm5uO3JldHVybiIifSxKbjpmdW5jdGlvbihhLGUpe3RoaXMuV2gucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMua20oZSksdmVuZG9yOmV9KTt0aGlzLmpvKCl9LENuOmZ1bmN0aW9uKGEsZSl7InZpZGVvIj09PWE/dGhpcy5Uby5tYXAoZnVuY3Rpb24oYSl7dGhpcy56ZyhhLGUpfS5iaW5kKHRoaXMpKTp0aGlzLnpnKGEsZSl9LHpnOmZ1bmN0aW9uKGEsZSl7dGhpcy5yZi5wdXNoKHt0eXBlOmEsCmZsOmUsdHE6ITF9KX0sam86ZnVuY3Rpb24oKXt0aGlzLldoLm1hcChmdW5jdGlvbihhKXthLkJtfHwoYS5tcSh7YWRTZXNzaW9uSWQ6Zi5WKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS54cSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuQm09ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmpuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWE9Yy5qbnx8WWE7bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmNvbmY9ZXx8e307dGhpcy5jPWE7dGhpcy5zYj1hLmRoKCk7dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSC5pZD0KZi5WKDEwKTt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5IYT17fTt0aGlzLkFnPSExO3RoaXMuZmM9W119Yy5laj1hO2EucHJvdG90eXBlPXtRbDpmdW5jdGlvbihhKXt2YXIgZT17fSxkPSExLGM9MCxlPTAsZj17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPSJmaXhlZCIsYz1lLmxlZnQsZT1lLnRvcCk7Zj17eDpjLHk6ZX07Zi5wb3NpdGlvbj1kO3JldHVybiBmfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlFsKGEpO2Zvcih2YXIgZT0wLGQ9MCxjPSExLGY9dGhpcy5xbShhKSxoPXt9O2E7KWUrPWEub2Zmc2V0TGVmdCsKYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZiYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxlKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxkKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihjPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmUseTpkfTtjJiYoaC5wb3NpdGlvbj1jKTtyZXR1cm4gaH0scW86ZnVuY3Rpb24oKXt0aGlzLkFnPSEwfSx2aTpmdW5jdGlvbigpe3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwKIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5jLmwoKSl9LE1uOmZ1bmN0aW9uKCl7dGhpcy5BZ3x8KHRoaXMuYy5wbGF5KCksZi5vKGsud2QsdGhpcy5jLmwoKSkpfSxLZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5jLnBhdXNlKCk7dGhpcy5ILnN0eWxlLnpJbmRleD1hO3RoaXMuSC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkguc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSC5zdHlsZS5ib3hTaXppbmc9dGhpcy5zYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuc2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkIuc3R5bGUud2lkdGg9dGhpcy5zYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLnNiKTt0aGlzLmMuWmMmJnRoaXMuYy5aYygpP3RoaXMuYy5kaCgpLmFwcGVuZENoaWxkKHRoaXMuSCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkgpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5jLmV4aXRGdWxsc2NyZWVuKCl9LHFtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8ZSYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPQohMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sTmw6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5nZXRQb3NpdGlvbihhKTtlLnBvc2l0aW9uP2UucG9zaXRpb249ZS5wb3NpdGlvbjplLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZS53aWR0aD1hLm9mZnNldFdpZHRoO2UuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBlfSxtYzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLk5sKHRoaXMuc2IpO2lmKGUueCE9dGhpcy5IYS54fHxlLnkhPXRoaXMuSGEueXx8ZS5wb3NpdGlvbiE9dGhpcy5IYS5wb3NpdGlvbnx8ZS53aWR0aCE9dGhpcy5IYS53aWR0aHx8ZS5oZWlnaHQhPXRoaXMuSGEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuSGEud2lkdGgmJjA8dGhpcy5IYS5oZWlnaHQmJjA9PWUud2lkdGgmJjA9PWUuaGVpZ2h0KXt0aGlzLlZlKCk7cmV0dXJufXRoaXMuSGE9ZTt0aGlzLmMuWmMoKT8odGhpcy5ILnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5ILnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSC5zdHlsZS5sZWZ0PQplLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWUueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZS5wb3NpdGlvbjt0aGlzLkIuc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5mYy5sZW5ndGg7YSsrKXRoaXMuZmNbYV0oe3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSl9Zi5QZih0aGlzLkgpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSx5ZzpmdW5jdGlvbihhKXt0aGlzLmZjfHwodGhpcy5mYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuZmMucHVzaChhKX0sVmU6ZnVuY3Rpb24oKXt0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTsKdGhpcy5CJiZ0aGlzLkIucGF1c2UmJnRoaXMuQi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuZWp8fFphLEQ9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWYuVigxMCk7TS5jb250cm9scz0hMDtELnB1c2goTSl9dmFyIEo9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYj1jLmFufHxhYjtuZXcgYWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwoYT10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3RoaXMuVChiKTt0aGlzLlJkKGEpO3RoaXMuUGcoKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZHx8KHRoaXMuaWQ9YSl9LFBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5UYSgpLGI9dGhpcy52aWRlb1RhZztifHwoKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiZhLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wYXJhbWV0ZXJzJiYhMT09PWEucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxlPXRoaXMuVGEoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7YS5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYX19KX0pKGMpOwp2YXIgYmI9Yy5Tanx8YmI7KGZ1bmN0aW9uKGMpe2MuUmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5kYz10aGlzLmRjfHwhMTt0aGlzLnFnPXRoaXMuc2c9dGhpcy52aD10aGlzLnphPXRoaXMuVWY9ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5MbChhLGIpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52aCYmdGhpcy5HZygpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLk1iO2EmJmEub2MmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudWQoKTt0aGlzLnZoPSEwO3RoaXMuR2coKX0uYmluZCh0aGlzKSk7dGhpcy5EZygpfSxHZzpmdW5jdGlvbigpe2lmKCF0aGlzLmRjKXt0aGlzLnVkKCk7aWYoIXRoaXMuVWYmJiF0aGlzLnVkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5VZiYmdGhpcy5xZyYmIXRoaXMuc2cmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSx1ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYSYmYS5hZE1hbmFnZXJzJiZhLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0samg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmU9MDtlPGIubW9kdWxlcy5sZW5ndGg7ZSsrKXt2YXIgYz1iLm1vZHVsZXNbZV07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LERnOmZ1bmN0aW9uKCl7aWYodGhpcy51ZCgpKXt2YXIgYT10aGlzLmpoKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuc2c9MDxhLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5xZz1hLlFwfXRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzQWRQbGF5aW5nP2EuaXEoKTohMX0sTmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QWREdXJhdGlvbj9hLk5jKCk6LTF9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzUGxheWluZyYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxMbDpmdW5jdGlvbihhLGIpe3RoaXMuZGM9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5kY3x8MzAyPT10aGlzLmRjP3RoaXMuemE9ITA6dGhpcy5tKCJhZGVycm9yIix0aGlzLmRjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfSx2ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT8odGhpcy53KCksdGhpcy5qYSgpKTphLlplKCk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuZW0oYSk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIGNiPWMuUmp8fGNiOyhmdW5jdGlvbihjKXtjLlRqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sRG06ZnVuY3Rpb24oKXt3aW5kb3cuT08uY2suR2suRWs/d2luZG93Lk9PLmNrLkdrLkVrLk9wKGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRtKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZhPTE1MDA7dmFyIGE9ZGEoKTtpZihhJiZhLl9faW50ZXJuYWwmJmEuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGYuU2UoYS5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYiBpbiBhLl9faW50ZXJuYWwucGxheWVycylpZihhLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGU9bmV3IGJiKGEuX19pbnRlcm5hbC5wbGF5ZXJzW2JdKTt0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBjYihlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgZGI9Yy5Uanx8ZGIsZWI9bmV3IGRiKHQpO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmxufHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5XaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLmhhPSExO3RoaXMubWgoKX0sbWg6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2F8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpOwphJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1oKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuU2goKX0sU2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYT90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2goKX0uYmluZCh0aGlzKSwKMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5XaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuVmk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sRGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5jb2RlLGU9YS5tZXNzYWdlO2EuZGF0YSYmKGI9YS5kYXRhLmNvZGUsZT1hLmRhdGEubWVzc2FnZSk7MTIwNSE9YiYmKDkwMD09YiYmMDxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKSk6MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/dGhpcy5qYSgpOnRoaXMuaSgpKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHMpO2EucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLkRlKGEpfS5iaW5kKHRoaXMpKTsKYS5wbGF5ZXIub24oInBsYXlpbmciLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRlKGEuYWRFcnJvckV2ZW50cyl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuVml8fGhiOyhmdW5jdGlvbihjKXtjLlhpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLlJkKE1hdGguY2VpbCgxRTEwKgpNYXRoLnJhbmRvbSgpKSksdGhpcy5MKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5VaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pO3RoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliLFQ9bmV3IGliKHQpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuYmt8fApqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubmt8fFU7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5uZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5obihhKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKdy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0saG46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZTtmb3IoZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkpe2I9aXNOYU4oYVtlXSk/ITE6YVtlXTtpZigxMDA5PT1hW2VdfHwxMDAxPT1hW2VdfHwzMDM9PWFbZV18fDQwMz09YVtlXSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGMgaW4gYVtlXSlpZihhW2VdLmhhc093blByb3BlcnR5KGMpJiYoYj1pc05hTihhW2VdW2NdKT8hMTphW2VdW2NdLDEwMDk9PWFbZV1bY118fDEwMDE9PWFbZV1bY118fDMwMz09YVtlXVtjXXx8NDAzPT1hW2VdW2NdKSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMubWt8fFY7KGZ1bmN0aW9uKGMpe2Mub2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLk1kJiYoYT1mLkVsKGEsdGhpcy5NZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTChkKTt2YXIgZz1uZXcgVihkLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuTWR8fAoodGhpcy5NZD1bXSksdGhpcy5NZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5LKGQpfHwodGhpcy5MKGQpLGc9bmV3IFYoZCx0aGlzLkYpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLk8oKX0sbmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwodGhpcy5jYVthXT17fSk7dGhpcy5jYVthXVtiXXx8KHRoaXMuY2FbYV1bYl09W10pO3RoaXMuY2FbYV1bYl0ucHVzaChjKX0sQm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYl0pdGhpcy5VY3x8KHRoaXMuVWM9W10pLHRoaXMuVWMucHVzaChhKSx0aGlzLkxuKCkmJih0aGlzLkFmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYl1bY10mJjA8dGhpcy5jYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPQowO2Q8dGhpcy5jYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuY2FbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9YS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ3LkJvKGEpfX0pfSkoYyk7dmFyIGtiPWMub2t8fGtiLHc9bmV3IGtiKHQpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5tcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMubXB8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sCnVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5TaXx8bWI7KGZ1bmN0aW9uKGMpe2MuVGk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2YuSmMucHVzaCh7Ilt3aWR0aF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRXaWR0aH0pO2YuSmMucHVzaCh7IltoZWlnaHRdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0SGVpZ2h0fSk7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkOwphLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5UaXx8bmI7KGZ1bmN0aW9uKGMpe2MuVWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZCk7dGhpcy5LKGgpfHwodGhpcy5MKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5MYSlpZihiPT10aGlzLkxhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5VaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMubnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLm5wfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Paj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy50bHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudWwoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSWcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz0KYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsaD1hLnNvdXJjZS5DSE9PU0VSX1RJTUV8fCIiO2YudHJhY2soInN0YXRzX2Nob29zZXJfYWIiLGMsITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfaW50ZXJhY3Rpb24iLGMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLklnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuQm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy5oYz1bXSk7dGhpcy5oYy5wdXNoKGEpfSx1bDpmdW5jdGlvbigpe2lmKHRoaXMuaGMmJnRoaXMuaGMubGVuZ3RoKWZvcih2YXIgYT0KMDthPHRoaXMuaGMubGVuZ3RoO2ErKyl0cnl7dGhpcy5oY1thXSgpfWNhdGNoKGIpe319LEZkOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylyZXR1cm4gdGhpcy5LYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEJuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuT2p8fHJiOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpO3RoaXMuRWk9ITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMuRWkmJih0aGlzLmkoKSx0aGlzLkVpPSEwLHRoaXMubmEoKSk7Yi5UYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSmV8fCh0aGlzLkplPTEpLHRoaXMuSmUrKywxMDA8dGhpcy5KZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTmp8fHNiOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT0KYSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHJiKGFbZF0pLHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLlBqfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlBpfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmI7KGZ1bmN0aW9uKGMpe2Mud2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LHpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuem4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuQ2Mpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtCjE7YisrKTEwMDkhPXRoaXMuaGJbYl0mJjMwMyE9dGhpcy5oYltiXSYmNDAzIT10aGlzLmhiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy53a3x8d2I7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuSyhjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IHdiKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciB4Yj1jLnlrfHwKeGIseWI9bmV3IHhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMuTWp8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnZmPSExfSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zbigpfS5iaW5kKHRoaXMpLDUwMCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLApiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnZmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnZmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmCmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LG1vOmZ1bmN0aW9uKCl7dGhpcy52Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuaGt8fEFiOyhmdW5jdGlvbihjKXtjLmdrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5WbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudWN8fCh0aGlzLnVjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLnVjfHx0aGlzLnVjKyssdGhpcy51Yzw9dGhpcy5WbT8odGhpcy51YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuZ2t8fEJiOyhmdW5jdGlvbihjKXtjLmlrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuaWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLlFqfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5laz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5la3x8RmI7KGZ1bmN0aW9uKGMpe2MuZGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVGEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLndsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5NbSgpOnRoaXMuRmcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSx3bDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkliKCk7IWEucGEmJmEuWSYmYS5OcCYmYS5QcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEZnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCl9LmJpbmQodGhpcyksMTAwKX0sSWI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5JYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5UYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sanE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSWIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuZGt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbmw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTChhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLm5sKGFbYl0pO3RoaXMuTygpfX0pO2MuZ2QuSWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy5wcHx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuS2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0saHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sWmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVGE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLktqfHxYOyhmdW5jdGlvbihjKXtjLkpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLndmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMud2Y9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy53ZiYmYyE9dGhpcy53Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLlIoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLm9xKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmp8fFk7KGZ1bmN0aW9uKGMpe2MuTGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLkFmKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMuTGp8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5Wb3x8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5wanx8TmI7KGZ1bmN0aW9uKGMpe2Mub2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTT10aGlzLk18fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxDZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkNlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLm9qfHxPYjsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTmIoYVtiXSk7Yy5oYXx8dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgT2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFBiPWMucWp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmZrfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT8oYz1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuWml8fFNiOyhmdW5jdGlvbihjKXtjLiRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy4kaXx8VGI7KGZ1bmN0aW9uKGMpe2MuYWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGM9bmV3IFNiKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSx3aW5kb3cuYnJpZHBsYXllcj1jLChuZXcgVGIoYyx0aGlzLkYpKS5mKCkpfX10aGlzLk8oKX19KX0pKGMpO3ZhciBVYj1jLmFqfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMuV2t8fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSxhZTpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LEFuOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuQmt8fFhiOyhmdW5jdGlvbihjKXtjLkFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0sZ2M6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkhrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuSGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmdjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuRG4oKX0sRG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55bj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy55bj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmdjKGEpKX19KX0pKGMpO3ZhciBZYj1jLkFrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhLkFuKCksYT1uZXcgWWIoYSx0aGlzLkYpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFpiPWMuQ2t8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5rbnx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy4kbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLiRkKGEpfS5iaW5kKHRoaXMpKX0sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5xa3x8TjsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuT2UpaWYodGhpcy5PYnx8Cih0aGlzLk9iPTApLHRoaXMuT2IrKywxNTx0aGlzLk9iKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLlpuKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5NKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5NPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMucGt8fE87KGZ1bmN0aW9uKGMpe2Mucms9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuQWYoKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBiYz1jLnJrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5GbHx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Hanx8WjsoZnVuY3Rpb24oYyl7Yy5Gaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuTT10aGlzLk18fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuU2IoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy55YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx5YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTT1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRmp8fGFhOyhmdW5jdGlvbihjKXtjLkhqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuSGp8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLklvfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLm1qfHxoYzsoZnVuY3Rpb24oYyl7Yy5saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5FZygpfSxFZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMubGp8fAppYzsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLkwoYSk7KG5ldyBpYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGpjPWMubmp8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLnJwfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLklpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5CZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnphPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5CZS5iaW5kKHRoaXMpLDEwMCl9LEJlOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5IaXx8bmM7KGZ1bmN0aW9uKGMpe2MuSmk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxTYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBuYyhhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgb2M9Yy5KaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuTWl8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5PZD1bXTt0aGlzLnpmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy4kaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmZtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnpmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy56ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5PZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxmbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy56ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxvbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5PZC5sZW5ndGg7YSsrKXRoaXMuT2RbYV0uWmImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZFthXS5aYil9fX0pKGMpO3ZhciByYz0KYy4kanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkttPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy5LbXx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGsuTG8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGsuZW4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTmUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5kanx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLkxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi52YigibmV3QWRkZWxpdmVyeSIpfWMuS2k9YTthLnByb3RvdHlwZT17Vm46ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApSbjpmdW5jdGlvbihhKXt0aGlzLkxiPWF9LFFuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LCRjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnVtKCkpdGhpcy5MYi5nKHRoaXMuTGIuUWMsdGhpcy5MYi5xYSx0aGlzLkxiLnlmLGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTGIuaWMpO2Vsc2UgaWYobC5EYiYmIWwuR2kpbC5UbShmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhrLkhjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5xbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTGIsaCk7bS5Obih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmdmJiYoZD10aGlzLnBsYXllci5nZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5qZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx1bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LGZvOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuJGMoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX0sZW86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRmYoInBvc3Ryb2xsIik7Zi52YigicG9zdHJvbGwiKTt0aGlzLlZuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLiRjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxHbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmJvKHRoaXMuZW8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sVGQ6ZnVuY3Rpb24oYSl7Zi52YigibWlkcm9sbCIpO2YuRmYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy4kYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxGbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLlVuKHRoaXMuVGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubWYoKX0sZjpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLnBsYXllci5tZiYmdGhpcy5GbigpO3RoaXMuR24oKX19fSkoYyk7dmFyIGZhPWMuS2l8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy55anx8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGJhZXJhZUhpVGhlcmVpbmcsYmFlcmFlSGlUaGVyZWluZyk7Cg==
- 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
H/1.1
|
200
OK
|
data
lb46.s400.meetrics.net/
|
43 B
308 B
|
26ms
26ms
|
Image
image/gif |
136.243.3.132
HETZNER-AS
|
|
General
- Full URL
- https://lb46.s400.meetrics.net/data?/K06kFAPAA/k0FWMmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A0zA2wAmvFytFh0FjvFklF94Et1EurFuvF3uFtzAx4EzxAmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF91AzwAz1AxwA2wAzmAjpFk9BxzA4zAwzA34Ay5Az4AmzEp6Fl9BzxA4zBxmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1zAwzA1xAw2AwzAmhEwkF91AzwAz1AxwA2wAzmAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A02A5zAmvFytFh0FjvFklF94Et1EurFuvF3uFtzAz4EzxAmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF91AzwAyzA00A3xA3mAjpFk9BxzA4zAwzA0xA30Ay1AmzEp6Fl9BzzA4zBxmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9zEr5FmhEwjF91AzwAyzA00A3xA3mAhwFk9B1zAwyAz0A03Ax3AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A04AzwALlnFDUkzFnBPICAAAAAAAB25yAPAAAFAA25yTbosAPAAAmUA9BABbosAZAAAOA55A55A85B55A58E55A55AGAywA41AwyArbosAPYBAAAAuRBKA5iASksFMFjAAAAAAAAAAAAEAAA25yAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFFAzzA4zBxBEMAxzA4zAwzA0xA30Ay1AGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA1zAwyAz0A03Ax3ADAzrF5BFKA1zAwyAz0A03Ax3AKA1zAwyAz0A03Ax3AtAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5BFdmUA9BAhAAfAAFAAAbosAAAAAPA4tB1uFruFv3FutBzzA4zBxBEAAAAAAAAAAAAAAAAQtjFjKx+YA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.132
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h224.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame 849C
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:819::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_2020022701.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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 B57A
|
73 KB
27 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:814::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_2020022701.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 88b230f7cc8dcdf4ac2d71c5537f063d2be6b51ecf10df6ba04bb53a0062b9f2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
sodar
Show response
pagead2.googlesyndication.com/getconfig/
Frame B57A
|
7 KB
5 KB
|
17ms
17ms
|
XHR
application/json |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020022701&st=env
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 2b538c1122ab6422830bb4050ea1354d05beeafe073a808b0a9ac1a3d458b37e
- 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
|
21ms
21ms
|
XHR
text/plain |
35.156.162.45
AMAZON-02
|
|
|
GET
H2
|
200
|
pubads_impl_2020022701.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 6944
|
164 KB
60 KB
|
30ms
30ms
|
Script
text/javascript |
172.217.23.130
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame 6944
|
113 B
175 B
|
16ms
15ms
|
Script
application/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
|
GET
H2
|
200
|
sodar2.js
Show response
tpc.googlesyndication.com/sodar/
Frame B57A
|
14 KB
5 KB
|
38ms
38ms
|
Script
text/javascript |
2a00:1450:4001:819::2001
GOOGLE
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame 6944
|
332 B
336 B
|
242ms
240ms
|
XHR
text/plain |
172.217.23.130
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4238642583443104&correlator=298183083531982&output=ldjh&impl=fif&eid=21065627%2C21062453&vrg=2020022701&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200305&iu_parts=5286166%2Cgiga.de%2CDFP-Passback-300x250&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=300x250&eri=6&cdm=www.giga.de&bc=31&abxe=1&lmt=1583389045&dt=1583389045003&dlt=1583389044901&idt=85&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=250&oid=3&adxs=968&adys=282&adks=3816689529&ucis=f4gk148ge3im&ifi=1&ifk=2690321143&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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&top=www.giga.de&dssz=8&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=1709835242.1583389045&ga_sid=1583389045&ga_hid=104766193&fws=256&ohw=0&btvi=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js?21065627
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.130
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s18-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 2cc04669e3c40fc1d94503f771236e704d0d01e44da3bd95795f7c140a0a1144
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020022701.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 6944
|
69 KB
25 KB
|
30ms
30ms
|
Script
text/javascript |
172.217.23.130
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame 6944
|
0
0
|
5ms
5ms
|
Other
text/html |
2a00:1450:4001:819::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_2020022701.js?21065627
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
DATA
|
200
OK
|
truncated
/
Frame 6944
|
211 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame C29F
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:819::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_2020022701.js?21065629
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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 5912
|
73 KB
27 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:814::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_2020022701.js?21065629
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 88b230f7cc8dcdf4ac2d71c5537f063d2be6b51ecf10df6ba04bb53a0062b9f2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
Frame 5912
|
0
60 B
|
14ms
13ms
|
Image
image/gif |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_sz&pvsid=992126920691706&r=120x600%7C160x600%7C300x600&w=160&h=600
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
sodar
Show response
pagead2.googlesyndication.com/getconfig/
Frame 5912
|
7 KB
5 KB
|
21ms
21ms
|
XHR
application/json |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020022701&st=env
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js?21065629
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 9e246664e309610d36fae107ce8d51f81c4cc10c74a233c5b845e55a2eb819f3
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.giga.de/
Frame 73F9
|
24 B
409 B
|
345ms
27ms
|
XHR
application/octet-stream |
144.76.9.6
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,dmFyIGJhZXJhZUhpVGhlcmVpbmc9YmFlcmFlSGlUaGVyZWluZ3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnRtKCkse2lkOmF9KX0sNTAwKTtpZihmLnBuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5SbihsKTtiLlFuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLlluKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlFpfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudm4uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnFoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnRqPWE7YS5wcm90b3R5cGU9e3BvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5xaFtiXSYmKHRoaXMucWhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5wbygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sU2s6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LHZuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLnVuKGIuZGF0YSl9LHVuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmgoYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZmg6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sUWs6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5PbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sT2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFlnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxGbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxlaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sJG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLiRuKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0semg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LAp6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPXo7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYSh6KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LHFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCx6PTA7ejxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeisrKSxnPWIuY2hhckNvZGVBdCh6KyspLHE9Yi5jaGFyQ29kZUF0KHorKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxBbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSx6PSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksej0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtSaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxybTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx6azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sSWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxrazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlJpKCl8fGIuWWkoKXx8Yi5ybSgpfHxiLlVqKCl8fGIuemsoKXx8Yi5JaigpfHxiLmtrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0sZ206ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LGhvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LCRnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnBuPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSx3bjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LGlvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMud24oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5GbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5lYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5lYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlFtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LFluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LHltOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnRqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnNqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eua3A9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5vcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuUW89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmNuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5scD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQ2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5nbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuanA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLk5vPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5lbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5zanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkptfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuY20oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy51anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLmdqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuYmo9YX0pKGMpO3ZhciBLPWMuYmp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5PaXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuU24oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LExuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxTbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkRoJiZMLm9vKGEpfSwkcDpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sem06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlpqfHxwOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sYm86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sVW46ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxacDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk1rKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApicTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxlcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFZwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5MaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy5YbT0zMDt0aGlzLmJjPVtdO3RoaXMubmI9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnhpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy5UbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnhpfHwodGhpcy54aT0hMCxmLmtmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxzbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnNtKCk7CmlmKCF0aGlzLndtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMubmIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5uYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm5iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksYT10aGlzLm5iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LFpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxUbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTGl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5OaXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaWp8fG9hOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5NcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmpqfHxwYTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMua2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkRrfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApO3RoaXMuVyhiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Eanx8c2E7KGZ1bmN0aW9uKGMpe2MuQ2o9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy50ZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGU9MDtlPApkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnJlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5YbSYmIXRoaXMueWEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTmQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMudGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5MZT90aGlzLkxlKys6dGhpcy5MZT0xOnRoaXMuS2U/CnRoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Danx8dGE7KGZ1bmN0aW9uKGMpe2MuRWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGU9MDtlPGIubGVuZ3RoO2UrKylhLnB1c2goYltlXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwplLndifHx0aGlzLksoZSl8fHRoaXMuem0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxYcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkxtfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy51az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwkZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGUpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnVrfHx4YTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy53aT0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5ibihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy55YigpKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuUigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9dGhpcy5PYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlJjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlJjfSx4bTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk9jKCksYj10aGlzLnZtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpe3RoaXMuRW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sRW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5SKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuUigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxXcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMueG0oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9jKCksYT10aGlzLlBjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5NPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmCmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZnE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/KHRoaXMudygpLHRoaXMuamEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55YSgpfHwoYXx8KHRoaXMud2k9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMud2ksZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHJsOmZ1bmN0aW9uKCl7dGhpcy5ncXx8KDEwPHRoaXMuV28/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMuV28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5LbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxLbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ybyl7dGhpcy5Ybz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksCjUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB5YT1jLnRrfHx5YTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5oaSh3aW5kb3cpOwpmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmhpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGhpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZGVvanMtcGxheWVyIikpJiZhLnBsYXllciYmYS5wbGF5ZXIucGxheWVyJiYoYT1hLnBsYXllci5wbGF5ZXIoKSxiLnB1c2goYSkpO2lmKDA8Zi5TZShiKSl7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmKGE9bmV3IHhhKGJbZV0pLGEuaGF8fHRoaXMuSyhhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgeWEoYSx0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuWmI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMudmt8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLnRmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5VKCk7CnJldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0scm46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fGIuTmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLnRmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCnVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE1hOmZ1bmN0aW9uKCl7fSwkZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLk9iKyssMTU8dGhpcy5PYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLk9lPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGU9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9CiEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLkJhKCk7CnZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuS2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLktsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Eucm4oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBSKGFbYl0pO2UuaGF8fHRoaXMuSyhlKXx8KHRoaXMuTChlKSwobmV3IENhKGUsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuWGt8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmVoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudG49YS5wb3NpdGlvbmluZzt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnN0eWxlLndpZHRoPWEud2lkdGg7ZS5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2Uuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtlLnN0eWxlLmhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1heEhlaWdodD0KYS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy50bil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTt0aGlzLkNkPWV9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5DZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQ2QpfSxsYTpmdW5jdGlvbigpe3JldHVybiEwfSxxbDpmdW5jdGlvbigpe2YuemgodGhpcy5DZCk7Zi5hZih0aGlzLkNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCmdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5Banx8R2E7KGZ1bmN0aW9uKGMpe2Muemo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhOyhmdW5jdGlvbihjKXtjLkJqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1mLmVoKGEsImVsZW1lbnRJRCIpO2lmKGYuemgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5LKGEpKSl7dGhpcy5MKGEpOyhuZXcgSWEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLkJqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5Wa3x8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnZqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sTms6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy52anx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCwKZyxjKXt0aGlzLkZhPWI7dGhpcy5aZz10aGlzLkZpPSExO3RoaXMuTGg9ZDt0aGlzLmlpPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmtiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbCYmbC5kZih0aGlzLkZhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2cmJjQhPWgucmVhZHlTdGF0ZSYmZyhoKX0uYmluZCh0aGlzKX1jLndqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhLmRhdGE7aWYoInN0cmluZyIhPQp0eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy5aZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5rYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5rYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmtiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuRml8fCh0aGlzLmtiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5rYi5zZW5kKGIpfWNhdGNoKGcpe2I9dGhpcy5GYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8CnRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTGgmJnRoaXMuTGgoKX1yZXR1cm4gdGhpcy5rYn19fSkoYyk7dmFyIE1hPWMud2p8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuY2o9YTthLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYil7dGhpcy5tZT1ifSxXbjpmdW5jdGlvbihiKXt0aGlzLkdhPWJ9LEluOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3ZwOiJBZENsaWNrVGhydSIseHA6IkFkRXJyb3IiLHlwOiJBZFN0b3BwZWQiLEJwOiJBZExpbmVhckNoYW5nZSIsQ3A6IkFkVGFnUGFyc2VkIixGcDoiQWRWaWRlb0NvbXBsZXRlIixJcDoiQWRMb2FkZWQiLApKcDoiQWRTa2lwcGVkIixLcDoiQWRTdGFydGVkIix6cDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEFwOiJBZEltcHJlc3Npb24iLHdwOiJBZENyZWF0aXZlVmlldyIsRHA6IkFkVmlkZW9NaWRwb2ludCIsRXA6IkFkUGF1c2VkIixHcDoiQWRWaWRlb1N0YXJ0IixIcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLm1lLGFbZF0pfSxIbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuR2EmJnRoaXMuR2EubGUpZm9yKHZhciBhIGluIHRoaXMuR2EubGUpdGhpcy5HYS5sZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkdhLHRoaXMuR2EubGVbYV0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuR2EuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwKMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5JbigpO3RoaXMuR2EmJnRoaXMuSG4oKX19fSkoYyk7dmFyIE5hPWMuY2p8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnBiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLm9iPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjt0aGlzLmVmPSExO3RoaXMucWE9dGhpcy5RYz0iIjt0aGlzLiRlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnlmPSExO3RoaXMuaWE9W107dGhpcy5XZT10aGlzLlZiPSIiO3RoaXMuamU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5pZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMubGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuYWM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2I9IiI7dGhpcy5YYj0KW107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmliPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmFiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkhkPTA7dGhpcy5waD0hMTt0aGlzLm9oPTFFMzt0aGlzLkVjPSExO3RoaXMuUGE9MUUzO3RoaXMua2Q9dGhpcy5sZD0iIjt0aGlzLkRiPW51bGw7dGhpcy5HaT0hMTt0aGlzLlljPXRoaXMuUWQ9bnVsbH1jLnhqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkNhLGFkdGFncGFyYW1ldGVyOnRoaXMucGIsYWR0YWdtb2RpZmllcjp0aGlzLm9iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5lYyxhZHRhZ3JlZ2V4OnRoaXMucWQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuZmYsCnNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLHNlcnZlcjp0aGlzLmlhLHN2bUNvbmZpZzp0aGlzLlZiLGhvbWFkQWRwYXRoOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5qZSxIT01BRF9CTE9DS0VEOnRoaXMuaWUsSE9NQURfTk9CTE9DS0VSOnRoaXMubGIsSE9NQURfQURCTE9DS0VSOnRoaXMuYWMsdGVzdEhpZGU6dGhpcy5XYix0ZXN0VGFnczp0aGlzLlhiLHRlc3RUYWdzSlM6dGhpcy5ZYix0ZXN0VGFnc1hIUjp0aGlzLmJkLHRlc3QzUENvb2tpZTp0aGlzLnRjLHRocm90dGxlOnRoaXMuWmQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5uYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmFiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5iYix2cGFpZDp0aGlzLmliLHNraXBBbGxvd2VkOnRoaXMuTGYsdm1hcHM6dGhpcy5hZyxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuRWMsYWRGYWxsYmFja1VSTDp0aGlzLmxkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5rZCx5aWVsZGxhYjp0aGlzLkRifX0sUG46ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMucGI9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYKKHRoaXMub2I9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuZmY9Yi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLnpiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuVGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmVmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLlFjPWIuZ2xvYmFsQ29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuJGU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5pYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlZiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5XZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5qZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJgoodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5sYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYodGhpcy5XYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5YYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlliPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuYmQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnRjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5aZD1iLnRocm90dGxlKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuSGc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMueGM9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5zZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5XZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLmJlPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYWI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmKHRoaXMuYmI9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5pYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5MZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5hZz1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkVjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LG9tOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYWJbYV0mJjE9PXRoaXMuYWJbYV0mJihiPSEwKTtyZXR1cm4gYn0sRWY6ZnVuY3Rpb24oYil7dGhpcy5hYltiXT0hMH0sWWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuYWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5hYlthXSYmMT09dGhpcy5hYlthXSYmYi5wdXNoKGEpO3JldHVybiBifSxYZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9Zi4kayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBnPSIiLGM9IiIsZj0iIixoPSIiO2lmKCF0aGlzLkNhJiYhYSlyZXR1cm4gbmV3IEMoYik7Zz10aGlzLmNmKGIpO2M9dGhpcy5hYShiKTtnPyh0aGlzLlNjKCk/Zj1iOmY9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZj10aGlzLnFjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMucGJ8fHRoaXMub2J8fAp0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5abShoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLiRsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sY2Y6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlNjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LGRmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuY2YoYik7cmV0dXJuIGF9LCRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLlJwOwpyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxIaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGcpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxZbTpmdW5jdGlvbihiLGEpe3ZhciBkPWYuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPApoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5IaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPXRoaXMuSGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Z31sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBnPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxabTpmdW5jdGlvbihiKXt0aGlzLnBiJiYoYis9dGhpcy5wYik7aWYodGhpcy5vYilmb3IodmFyIGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm9iW2FdKSk7aWYoZi5KYylmb3IodmFyIGQ9MDtkPGYuSmMubGVuZ3RoO2QrKyl7dmFyIGc9CmYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuWW0oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmYS5YbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuV24oYi5wbGF5ZXIpO2EuZigpfX0sZzpmdW5jdGlvbihiLGEsZCxnLGMsZil7bD10aGlzO3RoaXMuZWY9ITA7dGhpcy5RYz1iO3RoaXMucWE9YTt0aGlzLnlmPWQ7dGhpcy5lZT1nO3RoaXMuaWM9Yzt0aGlzLnhhPWZ8fHt9O3RoaXMucGwoKTt0aGlzLlBtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnFhKXRoaXMuTm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuR2MoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LENsOmZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQ9ITE7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxQbTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5RYyt0aGlzLnhlKCJnbG9iYWwiKSksdGhpcy5tbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkdjKCl9LmJpbmQodGhpcyksITApfSxObTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5xYSt0aGlzLnhlKCJjbGllbnQiLAotMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuU2IoKSk7dGhpcy54YSYmdGhpcy54YS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YiYmKGQ9IiIpO3RoaXMueGEmJnRoaXMueGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5zZCl7dGhpcy5zZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZSl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0KITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuJGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTt0aGlzLkJiKCk7Zi5MYyhrLnFuKTsoYT1mLlVhKHRoaXMuSWQoKSkpfHwoYT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxtbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZz0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmCihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihhLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnFhfHx0aGlzLlZifHx0aGlzLkFhfHx0aGlzLkdjKCk6KHRoaXMuQ2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5CYigpKX19LEdjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7CnRyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGQuc2VydmVyLmxlbmd0aDthKyspe3ZhciBiPWQuc2VydmVyW2FdO3RyeXt2YXIgZTsoZT12b2lkIDA9PT1iKXx8KGU9IWIucmVwbGFjZSgiW2hhc2hdIix0aGlzLkpmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpKS5tYXRjaChSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSkpO2lmKGUpcmV0dXJuITF9Y2F0Y2goZyl7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9CihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChmLlIoIndlYi5kZSIpfHxmLlIoImdteC5uZXQiKXx8Zi5SKCJnbXguYXQiKXx8Zi5SKCJnbXguY2giKXx8Zi5SKCIxdW5kMS5kZSIpKSYmIXRoaXMuU2MoKSlmb3IoYj0wO2I8dGhpcy5pYS5sZW5ndGg7YisrKXRoaXMuaWFbYl09dGhpcy5pYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8CiExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJnRoaXMuQWEmJnRoaXMuaWEubGVuZ3RoP3RoaXMuVGMoITEpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5sYikpLHRoaXMuQmIoKSl9LGNpOmZ1bmN0aW9uKGEpe3RoaXMubGR8fCh0aGlzLmxkPWF8fCIiKX0sVGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUyl7dmFyIGU9e307aWYoYSl7dmFyIGU9bmV3IEModGhpcy5xYygpKSxkPXRoaXMuYWEodGhpcy5WYik7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtlLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2UubWV0aG9kPSJQT1NUIn1lbHNlIGU9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGUsdGhpcy5yby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTthP3RoaXMuams/dGhpcy5zYSgibm9TVk1Db25maWciKToodGhpcy5qaz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuVGMoITApfS5iaW5kKHRoaXMpLCEwKX19LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBlPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtpZighdGhpcy5uYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubmM9ITA7dGhpcy5UYyghMCk7cmV0dXJufX1lPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZT0hMCl9Y2F0Y2goaCl7fWlmKCEoZXx8CmQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2EucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5XZj10aGlzLkFiKGQuc3RyaWN0KTt0aGlzLmJlPXRoaXMuQWIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuU2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmJiPXRoaXMuQWIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkFiKGQuZW5hYmxlZCk7dGhpcy5XYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlliPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuYmQ9ZC50ZXN0YWR0YWdzeGhyfHwKW107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5wYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLm9iPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5xZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5mZj1kLmpzcG9wdXBzfHwhMTt0aGlzLnpiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLmliPWQudnBhaWR8fCExO3RoaXMueGEudnBhaWQ9dGhpcy5pYjt0aGlzLkxmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMudGQ9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmFnPWQudm1hcHN8fCIiO3RoaXMuRWM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlpkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307dGhpcy5EYj0KZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuQ28oKSYmKHRoaXMuV2J8fHRoaXMuWWJ8fHRoaXMuWGJ8fHRoaXMuYmQpP3RoaXMueWY/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5FZSgpLHRoaXMuQmIoKSk6dGhpcy51bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlRmKCkpfX0sVG06ZnVuY3Rpb24oYSl7dGhpcy5HaT0hMDt2YXIgZT1mdW5jdGlvbihhKXtpZihhPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnwgKSIrYSsiPShbXjtdKykiKSkpcmV0dXJuIGFbMl19KCJhZHBfc2VncyIpfHwiZTAiLGU9dGhpcy5EYi51cmwucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltzZWdzXSIsCmVuY29kZVVSSUNvbXBvbmVudChlKSksZT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6ZSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLnFiKGUpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07Zi5LZCh0aGlzLnFjKCksIlBPU1QiLGUsZnVuY3Rpb24oZSl7dHJ5e3ZhciBnPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe31mLnRyYWNrKCJzdGF0c19oZF95bF9kYXRhIiwhKCFnfHwhZy5sZW5ndGgpLCEwKTt0cnl7aWYoZyYmZy5sZW5ndGgmJnRoaXMuRGIucGFyYW1ldGVyKXt2YXIgaD10aGlzLkRiLnBhcmFtZXRlci5zcGxpdCgiW2lkXSIpLmpvaW4oZ1swXS5pZHx8IjAiKSxoPWguc3BsaXQoIltwcmljZV0iKS5qb2luKGdbMF0ucHJpY2V8fDApO3RoaXMucGIrPWh9fWNhdGNoKEIpe2EoKX1hKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthKCl9LmJpbmQodGhpcyksITApfSx1bzpmdW5jdGlvbigpe3RoaXMudG8oKTt0aGlzLnZvKCl9LAp2bzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGU9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cud2lkdGg9MTtnLmhlaWdodD0xO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1mLlYoMTApLGg9Zi5WKDEwKSxCPWYuVigxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJkYXRhIiwiIil9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShCKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZi5xYihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGcpfWNhdGNoKGEpe31pZigzIT0KZCl7dmFyIGI9Zi5CZCgpO2lmKChiLmlzQ2hyb21lfHxiLmlzRmlyZWZveCkmJiFiLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsZSwhMCk7cmV0dXJufXRoaXMuc2EoImNzcF8iK2UpfWYudHJhY2soInN0YXRzX2hkX2NzcCIsZSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFRmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxZZDpmdW5jdGlvbihhKXt0aGlzLnhjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkNhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYihhKSksdGhpcy5CYigpLHRoaXMuRWUoKSl9LHRvOmZ1bmN0aW9uKCl7aWYodGhpcy5XYil7dmFyIGE9Zi5CZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuQ20oKSl0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTtlLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZD0wPT09ZS5vZmZzZXRXaWR0aHx8MD09PWUub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSk7YT1kfWNhdGNoKGcpe31hP3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMubGkoKX19ZWxzZSB0aGlzLmxpKCl9LFJmOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPQpkLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy55byhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlhiPXRoaXMuYmQpJiZ0aGlzLlhiLmxlbmd0aCl7dmFyIGQ9dGhpcy5YYi5zbGljZSgpLGc9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LHlvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gYygpe3JldHVybiBmPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGYpLCEwKTohMX12YXIgZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0aGlzLkthKG5ldyBDKGEpLGcsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxsaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz0KZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuem8oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuWWImJnRoaXMuWWIubGVuZ3RoKXt2YXIgZD10aGlzLlliLnNsaWNlKCksZzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUmYoKX0sem86ZnVuY3Rpb24oYSxlLGQpe2Z1bmN0aW9uIGcoKXtmKCkmJmUoKX1mdW5jdGlvbiBjKCl7ZigpJiZkKCl9ZnVuY3Rpb24gZigpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZSxkKXtkPT1hJiZmKCkmJgpjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtnKCl9fSxRZjpmdW5jdGlvbigpe2lmKHRoaXMudGMpdHJ5e2YuS2QodGhpcy50YywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5IYj0hdGhpcy5BYihhLmNjKTt0aGlzLlRmKCl9LmJpbmQodGhpcyksdGhpcy5qaS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmppKCl9ZWxzZSB0aGlzLlRmKCl9LGppOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpO3RoaXMuRWUoKX0sQ206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sCkJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMueGMmJihlPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2UsITApO3RoaXMuQ2EmJnRoaXMuaXNFbmFibGVkJiZ0aGlzLlFkJiZ0aGlzLmNsKCk7dGhpcy50YyYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkhiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5qZSkpO3RoaXMuZWUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZSYmdGhpcy5lZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5IYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuWWM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ZYy5pZD1mLlYoMTApO3RoaXMuWWMuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLlljKTt2YXIgYT10aGlzLlljLmNvbnRlbnRXaW5kb3csZT0KYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD1mdW5jdGlvbigpe2Zvcih2YXIgZSxnPTA7Zzx0aGlzLlFkLmxlbmd0aDtnKyspZT1hLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGUudHlwZT0idGV4dC9qYXZhc2NyaXB0IixlLnNyYz10aGlzLlFkW2ddLGEuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX0uYmluZCh0aGlzKTtlLnNyYz1mLkFlKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZSk7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZi50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sb2w6ZnVuY3Rpb24oKXtpZih0aGlzLmJlJiZ0aGlzLm9tKCkpe3ZhciBhPQp0aGlzLllsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZSl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZSxkLGcsYyxoKXt0aGlzLkhkfHwodGhpcy5IZD0wKTt0aGlzLkhkKys7dGhpcy5IZD50aGlzLm9oJiYhdGhpcy5waCYmKHRoaXMucGg9ITAsZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLm9oLCEwKSk7YT1uZXcgTWEoYSxlLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpO2cmJihhLkZpPSEwKTtjJiZmLkFtKCkmJihhLlpnPSEwKTtoJiYKKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLldtfHwodGhpcy5XbT0hMCxmLkRhKCl8fGYuZWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhlPWEucmVzcG9uc2VYTUwpfHwoZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJmcuY2hpbGROb2Rlc1swXT9nLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOgoiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGUpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoZSk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsCmcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LHNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmFnfSxtbDpmdW5jdGlvbigpe3RoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuS2EoYSx0aGlzLlBvLmJpbmQodGhpcyksdGhpcy5Pby5iaW5kKHRoaXMpKX0sClBvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5KbCgpfSxPbzpmdW5jdGlvbigpe30sSmw6ZnVuY3Rpb24oKXtmLkxjKGsuSWwpO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09ZS50eXBlJiZmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09ZS50eXBlKXt2YXIgZD1uZXcgSTt3aW5kb3dbZC5nYSgpXT0KdGhpcztmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LENvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWmR9LFNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGU9IiIsZD0wO2Q8YTtkKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGV9LEFiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0iIixkLGcsYyxmLGgsayxsPTA7bDxhLmxlbmd0aDspZD0KYS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZT1lKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBlfSxhYTpmdW5jdGlvbihhKXt2YXIgZT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtlW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixlKXtiJiYoZC5xdWVyeUtleVtiXT1lKX0pO3JldHVybiBkfSxKZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBlKGEpe3ZhciBiPSIiLGUsZDtmb3IoZT03OzA8PWU7ZS0tKWQ9YT4+PjQqZSYxNSxiKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGcsYyxmPUFycmF5KDgwKSwKaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChnKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKylmW2ddPWQoZltnLTNdXmZbZy04XV5mW2ctMTRdXmZbZy0xNl0sMSk7Yz1oO249aztwPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZwfH5uJnIpK3UrZltnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnB8biZyfHAmcikrdStmW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTYwOzc5Pj1nO2crKyl2PWQoYyw1KSsobl5wXnIpK3UrZltnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLApjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihlKGgpK2UoaykrZShsKStlKG0pK2UodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnhqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLlVrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSxkKXt0aGlzLmE9YTthLmMuUD90aGlzLmdiPWEuYy5QKCk6dGhpcy5nYj0iIjthLmMud2gmJmEuYy53aCh7cGF1c2U6dGhpcy5OZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLiRoLmJpbmQodGhpcyksbXV0ZTp0aGlzLm9mLmJpbmQodGhpcyksCnVubXV0ZTp0aGlzLkpvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEuc2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5qYz10aGlzLnJkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9ZTt0aGlzLmpiPXt9O3RoaXMudmlkZW89e307dGhpcy5WZD17fTtmLnZiKCJuZXdCaWdBZElkIik7dGhpcy5ibD1mLlYoMTApO3RoaXMuTmY9MDt0aGlzLm9kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMub2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMub2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuVGs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5XYz10aGlzLlVkPSExO3RoaXMuRmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy53ZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMub2M9ITE7dGhpcy56bD1mLlYoMTApO3RoaXMuUmI9Zi5WKDEwKTt0aGlzLlBiPWYuVigxMCk7dGhpcy5laT1mLlYoMTApO3RoaXMuY29uZj17fTt0aGlzLmZlPXRoaXMuJGI9dGhpcy5JZT10aGlzLnlkPXRoaXMuV2Q9dGhpcy5DYj10aGlzLnZjPXRoaXMuT2g9dGhpcy5IZT10aGlzLkRkPXRoaXMuRG89dGhpcy5GYj10aGlzLlFiPSExO3RoaXMuQWM9W107dGhpcy5wYz17fTt0aGlzLm1uPTIwMDt0aGlzLmRnPXRoaXMuZGQ9dGhpcy5GYz10aGlzLmNnPXRoaXMueGY9ITE7dGhpcy5xZj17fX1jLnJqPWE7YS5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihlPQp0aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBlfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5OYiYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMua28oKTtmLm8oay5Layx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqZjpmdW5jdGlvbihhLGUsZCxnKXt0aGlzLkZiPWQ7dmFyIGM9ITE7ZyYmZy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGM9ITApO2lmKHRoaXMuQS5TKXRoaXMuTmYrKyxmLnZiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxnPWwuZ2V0Q29uZmlnKCksZi5PZyYmKHRoaXMuQS5Qbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5BLkNhJiZ0aGlzLkEuaXNFbmFibGVkPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCwKa2VlcFVSTDplLGJpdHJhdGU6Zy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5pYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTplPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaWIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpnLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5RYSgpO2Vsc2V7dmFyIGg9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmNvKHRoaXMuYik7dGhpcy5raChhKTt0aGlzLkFjPXRoaXMuYWgoYSk7dGhpcy5zbCgpfSxraDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmltKGIpKSx0aGlzLmtoKGIucGFyZW50KSl9LGFoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5haChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlRsKGIpKSk7cmV0dXJuIGV9LFRsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLmtwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmNuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5IbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMubG8oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Rbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsubHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5vcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLk1vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLk5vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sY286ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuamIuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS5ycT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlRrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk9rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5taShlKSl7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5SayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmpiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuamIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuYW8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sYW86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuU2sodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5QaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMueWkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLmxtKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5abygpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuQ2ksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5jcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaHAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZ3AoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5pcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5lcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5EaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGUpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmFwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LCRvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0sYXA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sYnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LFpvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuZ2koKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxncDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxpcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LERpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LFlvOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsuanAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkRpKCEwKX0sT2s6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBlPWIuYWEoYSk7cmV0dXJuIGUucHJvdG9jb2wrIjovLyIrZS5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLlVvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbWk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFJrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5CaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQWk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm1pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlNvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLlJvKCk7dGhpcy55aSgpO3RoaXMuQmcoKTt0aGlzLmEuUGgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5kaSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuYmImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LExrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZmgoYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5pbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuTGsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5nbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuamIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS52aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlloKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkloKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sVW86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQmk6ZnVuY3Rpb24oKXtpZih0aGlzLkRvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5HbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5DaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmpiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLnZpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxzaTpmdW5jdGlvbigpe3RoaXMuT2h8fCh0aGlzLk9oPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxHbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudGl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnNpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuZ2koKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5iYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy50aT1hKX0sZmk6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxrbzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sZ2k6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LGxvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5iYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5iYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLnltKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGUpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkRsKHRoaXMuYi5PYSxhKX1jYXRjaChCKXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5OayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLlBrKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5YaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxQazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFhoOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sbm86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sam06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxEbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxTbzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy56aS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnppLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sUm86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuJGcoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm5pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Fby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5laTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LG9pOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LEVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sRm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxKbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuSG0oKSYmdGhpcy5HbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLkhvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LEhtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuaWJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5pYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5pYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxHbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sWmw6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LEhvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmlmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7fXRoaXMueGQoKX12YXIgZT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMsZD10aGlzLlpsKCk7dGhpcy5GYz10aGlzLldjPXRoaXMuZGQ9dGhpcy5kZz0hMDtyZXR1cm4gZT8oZi5lYigiaHR0cHM6Ly93d3cud2VsZWN0LmRlL2FwaS92MS9wcmVmbGlnaHQvYnlfYWxpYXMvIitlLCJkZXdlbGVjdHd3d3dlbGVjdGRlIix7fSxhLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpLHRoaXMuQSksITApOiExfSxMZzpmdW5jdGlvbihhKXt0aGlzLm5vKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZyghMCl9LmJpbmQodGhpcyksCnRoaXMubW4pOih0aGlzLldkPSEwLHRoaXMuYS5WZSgpLHRoaXMuYS5NbigpLHRoaXMub2M9ITEsYT10aGlzLmIuc3x8e30sdGhpcy5IZXx8KGEubm9Db21wbGV0ZVF1YXJ0aWxlPSEwKSxmLm8oay55bCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMuUmUoKS5ZaCgpKX0sUmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZi5hZih0aGlzLnZpZGVvLGEpP3RoaXMuJGgoKTp0aGlzLk5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIucmIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuRWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmCihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuQWMmJjA8dGhpcy5BYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuQWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sdTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYmwrIi0iK3RoaXMuTmY7dGhpcy5iJiZ0aGlzLmIuZ2gmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLmdoKCkpO3JldHVybiBhfSxSZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMucmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMucXB8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsZCxjKXt0aGlzLm9wdGlvbnM9Y3x8e307ZT1kO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm9hPW51bGw7dGhpcy5ZPVtdO3RoaXMuSj1udWxsO3RoaXMuemM9dGhpcy5CYz0hMTt0aGlzLmJhPSIiO3RoaXMuYmc9ITE7dGhpcy5yaD0iIjtjJiZjLmVtcHR5P3RoaXMuU20oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxlLGQ9W107Yy5zaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpLGI7Yj1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBlPSIiO2IucXVlcnlLZXkmJihlPWIucXVlcnlLZXkuaHZwKTtlJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBDKHRoaXMudXJsKTpsLnZhKGwuWGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7CnZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52cGFpZCYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfS5iaW5kKHRoaXMpLGM9ZnVuY3Rpb24oKXtyZXR1cm4gZCgpJiYoZi5SKCJtYXJ0aGFzdGV3YXJ0LmNvbSIpfHxmLlIoImZhbmRvbS5jb20iKXx8Zi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKX0uYmluZCh0aGlzKTtpZihkKCl8fGMoKSl7dmFyIGg9Zi5OZyh0aGlzLnVybCk7aHx8KGg9dGhpcy51cmwpO3ZhciBjPWZ1bmN0aW9uKCl7cmV0dXJuIDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4gMDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksbT1mdW5jdGlvbigpe3JldHVybihmLlIoImdpZ2EuZGUiKXx8Zi5SKCJraW5vLmRlIil8fGYuUigic3BpZWxldGlwcHMuZGUiKXx8Zi5SKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbj1mdW5jdGlvbigpe3JldHVybiAwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil8fDA8aC5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfS5iaW5kKHRoaXMpO2lmKGMoKXx8aygpfHxtKCl8fCJhcHBzcG90Ij09ZSluKCk/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5YZChoKSkrIiZ0eXBlPWpzIixiPWwudmEobC5YZCh0aGlzLnVybCksCiExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGYudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPWwudmEobC5YZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLlJtLmJpbmQodGhpcyksdGhpcy5PbS5iaW5kKHRoaXMpKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMub2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmCmEuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09Zi5OYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZVtiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goYyl7ZVtiXT17fX1lbHNlIGUuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZT1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSwKYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWYuTmJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1mLk5ifHx0aGlzLkVtKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLnNvKCkpdHJ5e3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1jLmxlbmd0aCYmKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrY1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1nLmZpcnN0Q2hpbGQ7ZS5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksCmI9MDtiPGEubGVuZ3RoO2IrKyllLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGUpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LEVtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sZT10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrCjYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9ZT8hMDohMX0sUm06ZnVuY3Rpb24oYSl7dGhpcy54bihhKTt0cnl7dGhpcy5vYT1hLnJlc3BvbnNlWE1MLHRoaXMub2F8fCh0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5yaD1hLnVybENhbGxlZDtpZih0aGlzLlkubGVuZ3RoKXRoaXMuVmMoKTtlbHNle3RoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKTt0cnl7Zi50cmFjaygic3RhdHNfaGRfbXR5dXJsIixmLlVhKHRoaXMuYmEpLCEwKX1jYXRjaChlKXt9fX0sU206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMub2F8fAoodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5ZLmxlbmd0aD90aGlzLlZjKCk6dGhpcy5yYSh0aGlzLlJhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5uZTpGLmdnfSkpfSxPbTpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5SYSh2LmZnLHtkZXB0aDpifSkpfSxWYzpmdW5jdGlvbigpe3RoaXMuSj10aGlzLlkuc2hpZnQoKTt0aGlzLkltKCk/dGhpcy5BbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLmxoKCksZSx7QWRTeXN0ZW06dGhpcy5TbCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuUmEodi5pZykpOihiPTAsdGhpcy5LbygpJiZ0aGlzLnVmKHRoaXMuQmwoKSkpfSxwZjpmdW5jdGlvbigpe3RoaXMuQmM/KHRoaXMuQmM9MTx0aGlzLlkubGVuZ3RoLAp0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LnBmKCl9LEloOmZ1bmN0aW9uKCl7dGhpcy56Yz8odGhpcy56Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5JaCgpfSxLbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhvKCk/dGhpcy53bygpPyEwOigtMSE9dGhpcy5OYygpP3RoaXMucmEodGhpcy5SYSh2LmhlKSk6dGhpcy5yYSh0aGlzLlJhKHYuZWcpKSwhMSk6KHRoaXMucmEodGhpcy5SYSh2LmZkLEYuaGcpKSwhMSl9LHVmOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmdlfHwoYS5nZT1bXSk7YS5nZS5wdXNoKHRoaXMucmgpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5sZigpKTthLkViPWEuRWI/YS5FYjp0aGlzLkJjO2EueWM9YS55Yz9hLnljOnRoaXMuemM7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT8KYS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzt0aGlzLnBhcmVudC51ZihhKX0sQmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZHVyYXRpb249dGhpcy5OYygpO2EuTj10aGlzLmloKCk7YS5yYj10aGlzLlVsKCk7YS55cT1bXTthLm9yaWdpbj10aGlzO2Eucz10aGlzLlJsKCk7YS5NZj10aGlzLmhtKGEuZHVyYXRpb24pO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztyZXR1cm4gYX0scmE6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPQphLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7aWYoIXRoaXMuSiYmdGhpcy5vYSYmdGhpcy5vYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLm9hO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGU9ITE7KGU9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZS5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuT2E9YS5lcnJvci5jb2RlIT12LmhlLmNvZGU/YS5PYS5jb25jYXQodGhpcy5WbCgpKTphLk9hLmNvbmNhdCh0aGlzLmRtKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQua2MmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5rYyYmdGhpcy5wYXJlbnQua2MoYSksYj0wLHRoaXMuVmMoKSk6KHRoaXMucGFyZW50JiYKdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sa2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQua2MoYSl9LFVnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLlJhKGEsYikpfSxSYTpmdW5jdGlvbihhLGIpe3ZhciBlPW5ldyBUYShhLGIpO2Uub3JpZ2luPXRoaXM7cmV0dXJuIGV9LEFvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmloKCkubGVuZ3RofSx3bzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuTmMoKX0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxraTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuU2YoKSYmCihhPSEwKTtyZXR1cm4gYX0seG46ZnVuY3Rpb24oYSl7dGhpcy5iYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLmJhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuYmE9IlVOS05PV04ifXRyeXt0aGlzLmJnPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGUpe319LEltOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5saCgpLmxlbmd0aH0sbGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSxTbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBkPWFbZV07W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7dHJ5e2lmKCJUcmFja2luZyI9PWQmJmEmJmEucGFyZW50Tm9kZSYmIlRyYWNraW5nRXZlbnRzIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lJiYoYS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJOb25MaW5lYXJBZHMiPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZXx8YS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJDb21wYW5pb24iPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpcmV0dXJufWNhdGNoKGUpe31pZihhJiYhdGhpcy55aChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy50YihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LHloOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT0KYS5ub2RlTmFtZT8hMDp0aGlzLnloKGEucGFyZW50Tm9kZSk6ITF9LGRtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxVbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxpaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKWIucHVzaCh7aWQ6YVtlXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2VdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbZV0uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtlXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksCmhlaWdodDphW2VdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksU3A6YVtlXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMudGIoYVtlXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUGF8fDFFMzt0cnl7dmFyIGM9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlBhKS1NYXRoLmFicyhkLWIuUGEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWMuY29uY2F0KGYpfWNhdGNoKGgpe31yZXR1cm4gYn0sUmw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGU9ITEsZD1bXSxiPSExLGM9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Yz1iPXRoaXMuR2QoYVtoXSk7dHJ5e2U9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtlPWJ9ZC5wdXNoKGUpO2YucHVzaChjKX0xPGEubGVuZ3RoPyhiPWQsaD1jKTooYj1lLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMudGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxobTpmdW5jdGlvbihhKXt2YXIgYj0hMSxlPSExLGQ9ITE7dHJ5e2U9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWUuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1mLmhvKGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGMpe2I9ITF9cmV0dXJuIGJ9LFFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy50YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sVGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuR2QoYSk6IiJ9LEdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuVGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLnNrfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuUGx8fFVhO25ldyBVYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTj1bXTt0aGlzLnJiPSIiO3RoaXMucz10aGlzLnljPXRoaXMuRWI9ITE7dGhpcy5YZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuWWU9IiJ9Yy5Zaj1hO2EucHJvdG90eXBlPXt2bDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk4ubGVuZ3RoO2UrKylpZigwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxibTpmdW5jdGlvbigpe2lmKCF0aGlzLlhlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ub2Epe3ZhciBhPXRoaXMub3JpZ2luLm9hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxlPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKykoZT1hW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWUuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuWGU9YVtkXSl9cmV0dXJuIHRoaXMuWGV9LApnaDpmdW5jdGlvbigpe2lmKHRoaXMuWWUpcmV0dXJuIHRoaXMuWWU7dmFyIGE9IiI7KGE9dGhpcy5ibSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuWWU9YX0sbG06ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk5bZV07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLllqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLmFsfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt2YXIgdj17b2U6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsTmE6IlhNTF9QQVJTRV9FUlJPUiJ9LGVnOnt0eXBlOiJlcnJvciIsY29kZToyMDIsCm1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTmE6IkRVUkFUSU9OX0VSUk9SIn0sZmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE5hOiJFTVBUWV9WQVNUIn0saWc6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTmE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LGZnOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApOYToiTE9BRF9FUlJPUiJ9LGtlOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixOYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LHNwOnt0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE5hOiJNRURJQUZJTEVfRVJST1IifSxoZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixOYToiRFVNTVlfQUQifX0sRj17Z2c6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixOYToiTk9fQURTIn0saGc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE5hOiJOT19NRURJQUZJTEVTIn0sdHA6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE5hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sbmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTmE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2E9Yy5HbHx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmVycm9yPWE7dGhpcy5BZD1lO3RoaXMuT2E9W107dGhpcy5vcmlnaW49bnVsbH1jLmhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5oanx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWGE9CmMubGt8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5aaD1hO3RoaXMudmlkZW89ZTt0aGlzLmNlPVtdO3RoaXMuV2g9W107dGhpcy5yZj1bXTt0aGlzLlRvPSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5JKCl9Yy51cD1hO2EucHJvdG90eXBlPXtJOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLlpoLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuWmhbYV0sZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCwKYz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7dmFyIGg9Zi5jb250ZW50V2luZG93O2gubnE9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuSm4uYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuQ24uYmluZCh0aGlzKX07dmFyIGs9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7ay5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Euc3JjPWQ7aC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2guZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTsKdGhpcy5jZS5wdXNoKHtzcmM6ZCxmcmFtZTpmLG5uOmMsdmVuZG9yOmUuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLnJmLmxlbmd0aDtlKyspe3ZhciBkPXRoaXMucmZbZV07ZC50eXBlPT09YSYmZC5mbCh0aGlzLldsKGEpKX19LFdsOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e3dxOiEwLHZxOjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e2txOiJ2aWRlbyIsenE6ImpzQ3VzdG9tIixBcToiMS4wLjAtZGV2In19O2Nhc2UgInN0YXJ0IjpyZXR1cm57dHlwZToic3RhcnQiLGRhdGE6e2R1cmF0aW9uOjEwLEJxOjEsVHA6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIiwKZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sa206ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLmNlLmxlbmd0aDtlKyspaWYodGhpcy5jZVtlXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLmNlW2VdLm5uO3JldHVybiIifSxKbjpmdW5jdGlvbihhLGUpe3RoaXMuV2gucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMua20oZSksdmVuZG9yOmV9KTt0aGlzLmpvKCl9LENuOmZ1bmN0aW9uKGEsZSl7InZpZGVvIj09PWE/dGhpcy5Uby5tYXAoZnVuY3Rpb24oYSl7dGhpcy56ZyhhLGUpfS5iaW5kKHRoaXMpKTp0aGlzLnpnKGEsZSl9LHpnOmZ1bmN0aW9uKGEsZSl7dGhpcy5yZi5wdXNoKHt0eXBlOmEsCmZsOmUsdHE6ITF9KX0sam86ZnVuY3Rpb24oKXt0aGlzLldoLm1hcChmdW5jdGlvbihhKXthLkJtfHwoYS5tcSh7YWRTZXNzaW9uSWQ6Zi5WKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS54cSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuQm09ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmpuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWE9Yy5qbnx8WWE7bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmNvbmY9ZXx8e307dGhpcy5jPWE7dGhpcy5zYj1hLmRoKCk7dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSC5pZD0KZi5WKDEwKTt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5IYT17fTt0aGlzLkFnPSExO3RoaXMuZmM9W119Yy5laj1hO2EucHJvdG90eXBlPXtRbDpmdW5jdGlvbihhKXt2YXIgZT17fSxkPSExLGM9MCxlPTAsZj17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPSJmaXhlZCIsYz1lLmxlZnQsZT1lLnRvcCk7Zj17eDpjLHk6ZX07Zi5wb3NpdGlvbj1kO3JldHVybiBmfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlFsKGEpO2Zvcih2YXIgZT0wLGQ9MCxjPSExLGY9dGhpcy5xbShhKSxoPXt9O2E7KWUrPWEub2Zmc2V0TGVmdCsKYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZiYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxlKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxkKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihjPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmUseTpkfTtjJiYoaC5wb3NpdGlvbj1jKTtyZXR1cm4gaH0scW86ZnVuY3Rpb24oKXt0aGlzLkFnPSEwfSx2aTpmdW5jdGlvbigpe3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwKIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5jLmwoKSl9LE1uOmZ1bmN0aW9uKCl7dGhpcy5BZ3x8KHRoaXMuYy5wbGF5KCksZi5vKGsud2QsdGhpcy5jLmwoKSkpfSxLZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5jLnBhdXNlKCk7dGhpcy5ILnN0eWxlLnpJbmRleD1hO3RoaXMuSC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkguc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSC5zdHlsZS5ib3hTaXppbmc9dGhpcy5zYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuc2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkIuc3R5bGUud2lkdGg9dGhpcy5zYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLnNiKTt0aGlzLmMuWmMmJnRoaXMuYy5aYygpP3RoaXMuYy5kaCgpLmFwcGVuZENoaWxkKHRoaXMuSCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkgpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5jLmV4aXRGdWxsc2NyZWVuKCl9LHFtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8ZSYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPQohMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sTmw6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5nZXRQb3NpdGlvbihhKTtlLnBvc2l0aW9uP2UucG9zaXRpb249ZS5wb3NpdGlvbjplLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZS53aWR0aD1hLm9mZnNldFdpZHRoO2UuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBlfSxtYzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLk5sKHRoaXMuc2IpO2lmKGUueCE9dGhpcy5IYS54fHxlLnkhPXRoaXMuSGEueXx8ZS5wb3NpdGlvbiE9dGhpcy5IYS5wb3NpdGlvbnx8ZS53aWR0aCE9dGhpcy5IYS53aWR0aHx8ZS5oZWlnaHQhPXRoaXMuSGEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuSGEud2lkdGgmJjA8dGhpcy5IYS5oZWlnaHQmJjA9PWUud2lkdGgmJjA9PWUuaGVpZ2h0KXt0aGlzLlZlKCk7cmV0dXJufXRoaXMuSGE9ZTt0aGlzLmMuWmMoKT8odGhpcy5ILnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5ILnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSC5zdHlsZS5sZWZ0PQplLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWUueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZS5wb3NpdGlvbjt0aGlzLkIuc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5mYy5sZW5ndGg7YSsrKXRoaXMuZmNbYV0oe3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSl9Zi5QZih0aGlzLkgpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSx5ZzpmdW5jdGlvbihhKXt0aGlzLmZjfHwodGhpcy5mYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuZmMucHVzaChhKX0sVmU6ZnVuY3Rpb24oKXt0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTsKdGhpcy5CJiZ0aGlzLkIucGF1c2UmJnRoaXMuQi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuZWp8fFphLEQ9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWYuVigxMCk7TS5jb250cm9scz0hMDtELnB1c2goTSl9dmFyIEo9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYj1jLmFufHxhYjtuZXcgYWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwoYT10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3RoaXMuVChiKTt0aGlzLlJkKGEpO3RoaXMuUGcoKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZHx8KHRoaXMuaWQ9YSl9LFBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5UYSgpLGI9dGhpcy52aWRlb1RhZztifHwoKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiZhLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wYXJhbWV0ZXJzJiYhMT09PWEucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxlPXRoaXMuVGEoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7YS5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYX19KX0pKGMpOwp2YXIgYmI9Yy5Tanx8YmI7KGZ1bmN0aW9uKGMpe2MuUmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5kYz10aGlzLmRjfHwhMTt0aGlzLnFnPXRoaXMuc2c9dGhpcy52aD10aGlzLnphPXRoaXMuVWY9ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5MbChhLGIpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52aCYmdGhpcy5HZygpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLk1iO2EmJmEub2MmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudWQoKTt0aGlzLnZoPSEwO3RoaXMuR2coKX0uYmluZCh0aGlzKSk7dGhpcy5EZygpfSxHZzpmdW5jdGlvbigpe2lmKCF0aGlzLmRjKXt0aGlzLnVkKCk7aWYoIXRoaXMuVWYmJiF0aGlzLnVkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5VZiYmdGhpcy5xZyYmIXRoaXMuc2cmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSx1ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYSYmYS5hZE1hbmFnZXJzJiZhLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0samg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmU9MDtlPGIubW9kdWxlcy5sZW5ndGg7ZSsrKXt2YXIgYz1iLm1vZHVsZXNbZV07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LERnOmZ1bmN0aW9uKCl7aWYodGhpcy51ZCgpKXt2YXIgYT10aGlzLmpoKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuc2c9MDxhLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5xZz1hLlFwfXRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzQWRQbGF5aW5nP2EuaXEoKTohMX0sTmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QWREdXJhdGlvbj9hLk5jKCk6LTF9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzUGxheWluZyYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxMbDpmdW5jdGlvbihhLGIpe3RoaXMuZGM9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5kY3x8MzAyPT10aGlzLmRjP3RoaXMuemE9ITA6dGhpcy5tKCJhZGVycm9yIix0aGlzLmRjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfSx2ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT8odGhpcy53KCksdGhpcy5qYSgpKTphLlplKCk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuZW0oYSk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIGNiPWMuUmp8fGNiOyhmdW5jdGlvbihjKXtjLlRqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sRG06ZnVuY3Rpb24oKXt3aW5kb3cuT08uY2suR2suRWs/d2luZG93Lk9PLmNrLkdrLkVrLk9wKGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRtKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZhPTE1MDA7dmFyIGE9ZGEoKTtpZihhJiZhLl9faW50ZXJuYWwmJmEuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGYuU2UoYS5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYiBpbiBhLl9faW50ZXJuYWwucGxheWVycylpZihhLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGU9bmV3IGJiKGEuX19pbnRlcm5hbC5wbGF5ZXJzW2JdKTt0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBjYihlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgZGI9Yy5Uanx8ZGIsZWI9bmV3IGRiKHQpO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmxufHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5XaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLmhhPSExO3RoaXMubWgoKX0sbWg6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2F8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpOwphJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1oKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuU2goKX0sU2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYT90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2goKX0uYmluZCh0aGlzKSwKMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5XaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuVmk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sRGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5jb2RlLGU9YS5tZXNzYWdlO2EuZGF0YSYmKGI9YS5kYXRhLmNvZGUsZT1hLmRhdGEubWVzc2FnZSk7MTIwNSE9YiYmKDkwMD09YiYmMDxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKSk6MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/dGhpcy5qYSgpOnRoaXMuaSgpKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHMpO2EucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLkRlKGEpfS5iaW5kKHRoaXMpKTsKYS5wbGF5ZXIub24oInBsYXlpbmciLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRlKGEuYWRFcnJvckV2ZW50cyl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuVml8fGhiOyhmdW5jdGlvbihjKXtjLlhpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLlJkKE1hdGguY2VpbCgxRTEwKgpNYXRoLnJhbmRvbSgpKSksdGhpcy5MKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5VaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pO3RoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliLFQ9bmV3IGliKHQpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuYmt8fApqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubmt8fFU7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5uZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5obihhKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKdy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0saG46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZTtmb3IoZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkpe2I9aXNOYU4oYVtlXSk/ITE6YVtlXTtpZigxMDA5PT1hW2VdfHwxMDAxPT1hW2VdfHwzMDM9PWFbZV18fDQwMz09YVtlXSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGMgaW4gYVtlXSlpZihhW2VdLmhhc093blByb3BlcnR5KGMpJiYoYj1pc05hTihhW2VdW2NdKT8hMTphW2VdW2NdLDEwMDk9PWFbZV1bY118fDEwMDE9PWFbZV1bY118fDMwMz09YVtlXVtjXXx8NDAzPT1hW2VdW2NdKSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMubWt8fFY7KGZ1bmN0aW9uKGMpe2Mub2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLk1kJiYoYT1mLkVsKGEsdGhpcy5NZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTChkKTt2YXIgZz1uZXcgVihkLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuTWR8fAoodGhpcy5NZD1bXSksdGhpcy5NZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5LKGQpfHwodGhpcy5MKGQpLGc9bmV3IFYoZCx0aGlzLkYpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLk8oKX0sbmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwodGhpcy5jYVthXT17fSk7dGhpcy5jYVthXVtiXXx8KHRoaXMuY2FbYV1bYl09W10pO3RoaXMuY2FbYV1bYl0ucHVzaChjKX0sQm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYl0pdGhpcy5VY3x8KHRoaXMuVWM9W10pLHRoaXMuVWMucHVzaChhKSx0aGlzLkxuKCkmJih0aGlzLkFmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYl1bY10mJjA8dGhpcy5jYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPQowO2Q8dGhpcy5jYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuY2FbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9YS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ3LkJvKGEpfX0pfSkoYyk7dmFyIGtiPWMub2t8fGtiLHc9bmV3IGtiKHQpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5tcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMubXB8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sCnVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5TaXx8bWI7KGZ1bmN0aW9uKGMpe2MuVGk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2YuSmMucHVzaCh7Ilt3aWR0aF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRXaWR0aH0pO2YuSmMucHVzaCh7IltoZWlnaHRdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0SGVpZ2h0fSk7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkOwphLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5UaXx8bmI7KGZ1bmN0aW9uKGMpe2MuVWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZCk7dGhpcy5LKGgpfHwodGhpcy5MKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5MYSlpZihiPT10aGlzLkxhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5VaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMubnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLm5wfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Paj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy50bHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudWwoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSWcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz0KYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsaD1hLnNvdXJjZS5DSE9PU0VSX1RJTUV8fCIiO2YudHJhY2soInN0YXRzX2Nob29zZXJfYWIiLGMsITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfaW50ZXJhY3Rpb24iLGMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLklnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuQm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy5oYz1bXSk7dGhpcy5oYy5wdXNoKGEpfSx1bDpmdW5jdGlvbigpe2lmKHRoaXMuaGMmJnRoaXMuaGMubGVuZ3RoKWZvcih2YXIgYT0KMDthPHRoaXMuaGMubGVuZ3RoO2ErKyl0cnl7dGhpcy5oY1thXSgpfWNhdGNoKGIpe319LEZkOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylyZXR1cm4gdGhpcy5LYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEJuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuT2p8fHJiOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpO3RoaXMuRWk9ITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMuRWkmJih0aGlzLmkoKSx0aGlzLkVpPSEwLHRoaXMubmEoKSk7Yi5UYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSmV8fCh0aGlzLkplPTEpLHRoaXMuSmUrKywxMDA8dGhpcy5KZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTmp8fHNiOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT0KYSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHJiKGFbZF0pLHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLlBqfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlBpfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmI7KGZ1bmN0aW9uKGMpe2Mud2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LHpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuem4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuQ2Mpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtCjE7YisrKTEwMDkhPXRoaXMuaGJbYl0mJjMwMyE9dGhpcy5oYltiXSYmNDAzIT10aGlzLmhiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy53a3x8d2I7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuSyhjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IHdiKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciB4Yj1jLnlrfHwKeGIseWI9bmV3IHhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMuTWp8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnZmPSExfSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zbigpfS5iaW5kKHRoaXMpLDUwMCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLApiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnZmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnZmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmCmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LG1vOmZ1bmN0aW9uKCl7dGhpcy52Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuaGt8fEFiOyhmdW5jdGlvbihjKXtjLmdrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5WbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudWN8fCh0aGlzLnVjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLnVjfHx0aGlzLnVjKyssdGhpcy51Yzw9dGhpcy5WbT8odGhpcy51YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuZ2t8fEJiOyhmdW5jdGlvbihjKXtjLmlrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuaWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLlFqfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5laz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5la3x8RmI7KGZ1bmN0aW9uKGMpe2MuZGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVGEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLndsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5NbSgpOnRoaXMuRmcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSx3bDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkliKCk7IWEucGEmJmEuWSYmYS5OcCYmYS5QcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEZnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCl9LmJpbmQodGhpcyksMTAwKX0sSWI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5JYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5UYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sanE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSWIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuZGt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbmw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTChhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLm5sKGFbYl0pO3RoaXMuTygpfX0pO2MuZ2QuSWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy5wcHx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuS2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0saHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sWmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVGE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLktqfHxYOyhmdW5jdGlvbihjKXtjLkpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLndmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMud2Y9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy53ZiYmYyE9dGhpcy53Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLlIoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLm9xKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmp8fFk7KGZ1bmN0aW9uKGMpe2MuTGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLkFmKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMuTGp8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5Wb3x8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5wanx8TmI7KGZ1bmN0aW9uKGMpe2Mub2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTT10aGlzLk18fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxDZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkNlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLm9qfHxPYjsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTmIoYVtiXSk7Yy5oYXx8dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgT2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFBiPWMucWp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmZrfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT8oYz1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuWml8fFNiOyhmdW5jdGlvbihjKXtjLiRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy4kaXx8VGI7KGZ1bmN0aW9uKGMpe2MuYWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGM9bmV3IFNiKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSx3aW5kb3cuYnJpZHBsYXllcj1jLChuZXcgVGIoYyx0aGlzLkYpKS5mKCkpfX10aGlzLk8oKX19KX0pKGMpO3ZhciBVYj1jLmFqfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMuV2t8fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSxhZTpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LEFuOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuQmt8fFhiOyhmdW5jdGlvbihjKXtjLkFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0sZ2M6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkhrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuSGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmdjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuRG4oKX0sRG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55bj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy55bj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmdjKGEpKX19KX0pKGMpO3ZhciBZYj1jLkFrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhLkFuKCksYT1uZXcgWWIoYSx0aGlzLkYpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFpiPWMuQ2t8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5rbnx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy4kbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLiRkKGEpfS5iaW5kKHRoaXMpKX0sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5xa3x8TjsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuT2UpaWYodGhpcy5PYnx8Cih0aGlzLk9iPTApLHRoaXMuT2IrKywxNTx0aGlzLk9iKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLlpuKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5NKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5NPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMucGt8fE87KGZ1bmN0aW9uKGMpe2Mucms9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuQWYoKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBiYz1jLnJrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5GbHx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Hanx8WjsoZnVuY3Rpb24oYyl7Yy5Gaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuTT10aGlzLk18fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuU2IoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy55YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx5YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTT1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRmp8fGFhOyhmdW5jdGlvbihjKXtjLkhqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuSGp8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLklvfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLm1qfHxoYzsoZnVuY3Rpb24oYyl7Yy5saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5FZygpfSxFZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMubGp8fAppYzsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLkwoYSk7KG5ldyBpYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGpjPWMubmp8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLnJwfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLklpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5CZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnphPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5CZS5iaW5kKHRoaXMpLDEwMCl9LEJlOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5IaXx8bmM7KGZ1bmN0aW9uKGMpe2MuSmk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxTYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBuYyhhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgb2M9Yy5KaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuTWl8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5PZD1bXTt0aGlzLnpmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy4kaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmZtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnpmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy56ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5PZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxmbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy56ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxvbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5PZC5sZW5ndGg7YSsrKXRoaXMuT2RbYV0uWmImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZFthXS5aYil9fX0pKGMpO3ZhciByYz0KYy4kanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkttPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy5LbXx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGsuTG8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGsuZW4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTmUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5kanx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLkxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi52YigibmV3QWRkZWxpdmVyeSIpfWMuS2k9YTthLnByb3RvdHlwZT17Vm46ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApSbjpmdW5jdGlvbihhKXt0aGlzLkxiPWF9LFFuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LCRjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnVtKCkpdGhpcy5MYi5nKHRoaXMuTGIuUWMsdGhpcy5MYi5xYSx0aGlzLkxiLnlmLGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTGIuaWMpO2Vsc2UgaWYobC5EYiYmIWwuR2kpbC5UbShmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhrLkhjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5xbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTGIsaCk7bS5Obih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmdmJiYoZD10aGlzLnBsYXllci5nZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5qZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx1bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LGZvOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuJGMoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX0sZW86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRmYoInBvc3Ryb2xsIik7Zi52YigicG9zdHJvbGwiKTt0aGlzLlZuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLiRjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxHbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmJvKHRoaXMuZW8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sVGQ6ZnVuY3Rpb24oYSl7Zi52YigibWlkcm9sbCIpO2YuRmYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy4kYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxGbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLlVuKHRoaXMuVGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubWYoKX0sZjpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLnBsYXllci5tZiYmdGhpcy5GbigpO3RoaXMuR24oKX19fSkoYyk7dmFyIGZhPWMuS2l8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy55anx8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGJhZXJhZUhpVGhlcmVpbmcsYmFlcmFlSGlUaGVyZWluZyk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
144.76.9.6
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.6.9.76.144.clients.your-server.de
- Software
-
openresty/1.15.8.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame FA1F
|
241 B
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
sodar2.js
Show response
tpc.googlesyndication.com/sodar/
Frame 5912
|
14 KB
5 KB
|
38ms
38ms
|
Script
text/javascript |
2a00:1450:4001:819::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js?21065629
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
st
imprammp.taboola.com/
Frame E2AA
|
0
0
|
32ms
31ms
|
Document
text/plain |
151.101.14.49
FASTLY
|
|
General
- Full URL
- https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=987ED447D723941138969859662&cicmp=1657475&cijs=1&dast=V7ydYCFgMUnIS00PDt0AQUnIS00PDt0AUAAAAGBvQHGzncrUik0W7Em2yWo8Vis5sNl7vhbDHbTCHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3whabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-hpOHz-gofz8DC7xX6f0-7W_N06l9H0eavuJrfm7xb7XZ7TW2m0vMV-n9PuFlz-FrPL7fLLAQAAAOABQKmwH-IHEAAgAgAAAEACAAAAgCKg4t9C4AIAAAAAA6AA60cDgIJDYV0uy8Vl-bns_gAAeAgAAQAYUCABGMBpKgGoyDk4AQAAAAAAAABg-f___48B0CM-kwHIUBq8MegBePABeBACAAC4GDoQxWEFEDsxISpILGIEAAAAIGU2YXg0qRMqiyoAAIJ0K4ArAIAAuNSrt8os3UGJtzAAAACCsQV6WPx-s8Ou8btdBgAAAAAAAABg9n_2jybEZMCdBkT5Tar2CwgAsPYLCADApm4AAG8CcEEXAKsziMlmtJvMDgAAAODu____Xw-kXIOJczHZDAYjl2s58hiHM9ty4zCuVpPBzDZabO_V3IfsKwrkum9EWGa_76CgnJ4es8sgY7lMBrVA1jS5_AbxQcOwnAyC-U3YYrSaTDbL4Wy5mAyGo-FotD-BGw1wgobDwWI3WOwWi-FkMRkNloMFCsRgghMyHG0mq9FutZssh5PRaLaZbJCiVavZaDMYrmaT2W63Gg6Gy9EIKVqzmE0mi9loudsMlpPRYDgZDhFGhqvZaDfYrCUWz8gtmthGa4VtZXJLRpvRxLeYzHYTl1v0-pheq4VjZTNN8aFOF8e-dmGoTh_HvnbiomAA2V4EF-lEc7r8XS7LW_O2uHVOn8MilmhOFulEdtm3XIOJczHZDAYjl2s58hiHM9ty4zCuVpPBzDZa7CvD1Wy0G2zWEotn5BZNbKO1wrYyuSWjzWjiW0xmu4nLLXp9TK_VwrGymfaN1XCzGS4Ho9G-sRpuNsPlYDTad-gM39XnbFTetAqPTmp2No4vmemgcBks3o1qdRx_Jgdp2Wx06pSJY1Fj9Pv9fr_f7_f7_X6D1nMwGxS-a1mq_Bt2N-c2-zoYFbFEcLpIJ6KX8XQRSyRPi3SisphWM9_K4ptYLBaXcbQwmZzL3WgymGxmrtVyYRFLlKaLdKLXvSwOw-HzFzych4fZL3oaDp-_4OE8PMxusd_ntLs1f7fOZTR93qq7ya35u8V-l-f0Vhotb7Hf57S7BZe_xexyuyzqPzbgZK4YTOaK5VyxGa0SAAAAAAAAAMAS5sybAAAAAJwGslgMJovlAkCIse4SfEqFPDqBvxU3fgwxp8vf5bK8NW-LW-f0Ocy8GQ!&excid=22&tst=1&docw=0&cs=false
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- 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
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.giga.de/9b525db8ea1af4d4bf0fb0ae1491cdb100b85e81/
Frame 73F9
|
109 B
671 B
|
101ms
32ms
|
XHR
application/json |
5.9.139.135
HETZNER-AS
|
|
General
- Full URL
- https://ssl.2.damoh.giga.de/9b525db8ea1af4d4bf0fb0ae1491cdb100b85e81/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGJhZXJhZUhpVGhlcmVpbmc9YmFlcmFlSGlUaGVyZWluZ3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnRtKCkse2lkOmF9KX0sNTAwKTtpZihmLnBuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5SbihsKTtiLlFuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLlluKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlFpfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudm4uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnFoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnRqPWE7YS5wcm90b3R5cGU9e3BvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5xaFtiXSYmKHRoaXMucWhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5wbygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sU2s6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LHZuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLnVuKGIuZGF0YSl9LHVuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmgoYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZmg6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sUWs6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5PbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sT2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFlnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxGbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxlaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sJG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLiRuKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0semg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LAp6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPXo7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYSh6KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LHFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCx6PTA7ejxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeisrKSxnPWIuY2hhckNvZGVBdCh6KyspLHE9Yi5jaGFyQ29kZUF0KHorKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxBbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSx6PSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksej0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtSaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxybTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx6azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sSWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxrazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlJpKCl8fGIuWWkoKXx8Yi5ybSgpfHxiLlVqKCl8fGIuemsoKXx8Yi5JaigpfHxiLmtrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0sZ206ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LGhvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LCRnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnBuPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSx3bjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LGlvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMud24oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5GbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5lYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5lYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlFtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LFluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LHltOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnRqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnNqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eua3A9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5vcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuUW89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmNuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5scD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQ2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5nbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuanA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLk5vPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5lbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5zanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkptfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuY20oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy51anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLmdqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuYmo9YX0pKGMpO3ZhciBLPWMuYmp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5PaXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuU24oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LExuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxTbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkRoJiZMLm9vKGEpfSwkcDpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sem06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlpqfHxwOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sYm86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sVW46ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxacDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk1rKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApicTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxlcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFZwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5MaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy5YbT0zMDt0aGlzLmJjPVtdO3RoaXMubmI9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnhpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy5UbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnhpfHwodGhpcy54aT0hMCxmLmtmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxzbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnNtKCk7CmlmKCF0aGlzLndtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMubmIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5uYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm5iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksYT10aGlzLm5iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LFpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxUbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTGl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5OaXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaWp8fG9hOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5NcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmpqfHxwYTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMua2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkRrfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApO3RoaXMuVyhiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Eanx8c2E7KGZ1bmN0aW9uKGMpe2MuQ2o9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy50ZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGU9MDtlPApkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnJlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5YbSYmIXRoaXMueWEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTmQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMudGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5MZT90aGlzLkxlKys6dGhpcy5MZT0xOnRoaXMuS2U/CnRoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Danx8dGE7KGZ1bmN0aW9uKGMpe2MuRWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGU9MDtlPGIubGVuZ3RoO2UrKylhLnB1c2goYltlXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwplLndifHx0aGlzLksoZSl8fHRoaXMuem0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxYcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkxtfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy51az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwkZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGUpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnVrfHx4YTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy53aT0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5ibihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy55YigpKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuUigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9dGhpcy5PYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlJjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlJjfSx4bTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk9jKCksYj10aGlzLnZtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpe3RoaXMuRW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sRW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5SKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuUigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxXcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMueG0oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9jKCksYT10aGlzLlBjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5NPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmCmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZnE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/KHRoaXMudygpLHRoaXMuamEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55YSgpfHwoYXx8KHRoaXMud2k9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMud2ksZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHJsOmZ1bmN0aW9uKCl7dGhpcy5ncXx8KDEwPHRoaXMuV28/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMuV28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5LbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxLbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ybyl7dGhpcy5Ybz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksCjUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB5YT1jLnRrfHx5YTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5oaSh3aW5kb3cpOwpmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmhpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGhpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZGVvanMtcGxheWVyIikpJiZhLnBsYXllciYmYS5wbGF5ZXIucGxheWVyJiYoYT1hLnBsYXllci5wbGF5ZXIoKSxiLnB1c2goYSkpO2lmKDA8Zi5TZShiKSl7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmKGE9bmV3IHhhKGJbZV0pLGEuaGF8fHRoaXMuSyhhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgeWEoYSx0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuWmI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMudmt8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLnRmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5VKCk7CnJldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0scm46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fGIuTmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLnRmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCnVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE1hOmZ1bmN0aW9uKCl7fSwkZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLk9iKyssMTU8dGhpcy5PYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLk9lPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGU9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9CiEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLkJhKCk7CnZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuS2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLktsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Eucm4oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBSKGFbYl0pO2UuaGF8fHRoaXMuSyhlKXx8KHRoaXMuTChlKSwobmV3IENhKGUsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuWGt8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmVoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudG49YS5wb3NpdGlvbmluZzt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnN0eWxlLndpZHRoPWEud2lkdGg7ZS5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2Uuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtlLnN0eWxlLmhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1heEhlaWdodD0KYS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy50bil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTt0aGlzLkNkPWV9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5DZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQ2QpfSxsYTpmdW5jdGlvbigpe3JldHVybiEwfSxxbDpmdW5jdGlvbigpe2YuemgodGhpcy5DZCk7Zi5hZih0aGlzLkNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCmdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5Banx8R2E7KGZ1bmN0aW9uKGMpe2Muemo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhOyhmdW5jdGlvbihjKXtjLkJqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1mLmVoKGEsImVsZW1lbnRJRCIpO2lmKGYuemgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5LKGEpKSl7dGhpcy5MKGEpOyhuZXcgSWEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLkJqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5Wa3x8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnZqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sTms6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy52anx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCwKZyxjKXt0aGlzLkZhPWI7dGhpcy5aZz10aGlzLkZpPSExO3RoaXMuTGg9ZDt0aGlzLmlpPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmtiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbCYmbC5kZih0aGlzLkZhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2cmJjQhPWgucmVhZHlTdGF0ZSYmZyhoKX0uYmluZCh0aGlzKX1jLndqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhLmRhdGE7aWYoInN0cmluZyIhPQp0eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy5aZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5rYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5rYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmtiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuRml8fCh0aGlzLmtiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5rYi5zZW5kKGIpfWNhdGNoKGcpe2I9dGhpcy5GYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8CnRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTGgmJnRoaXMuTGgoKX1yZXR1cm4gdGhpcy5rYn19fSkoYyk7dmFyIE1hPWMud2p8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuY2o9YTthLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYil7dGhpcy5tZT1ifSxXbjpmdW5jdGlvbihiKXt0aGlzLkdhPWJ9LEluOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3ZwOiJBZENsaWNrVGhydSIseHA6IkFkRXJyb3IiLHlwOiJBZFN0b3BwZWQiLEJwOiJBZExpbmVhckNoYW5nZSIsQ3A6IkFkVGFnUGFyc2VkIixGcDoiQWRWaWRlb0NvbXBsZXRlIixJcDoiQWRMb2FkZWQiLApKcDoiQWRTa2lwcGVkIixLcDoiQWRTdGFydGVkIix6cDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEFwOiJBZEltcHJlc3Npb24iLHdwOiJBZENyZWF0aXZlVmlldyIsRHA6IkFkVmlkZW9NaWRwb2ludCIsRXA6IkFkUGF1c2VkIixHcDoiQWRWaWRlb1N0YXJ0IixIcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLm1lLGFbZF0pfSxIbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuR2EmJnRoaXMuR2EubGUpZm9yKHZhciBhIGluIHRoaXMuR2EubGUpdGhpcy5HYS5sZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkdhLHRoaXMuR2EubGVbYV0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuR2EuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwKMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5JbigpO3RoaXMuR2EmJnRoaXMuSG4oKX19fSkoYyk7dmFyIE5hPWMuY2p8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnBiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLm9iPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjt0aGlzLmVmPSExO3RoaXMucWE9dGhpcy5RYz0iIjt0aGlzLiRlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnlmPSExO3RoaXMuaWE9W107dGhpcy5XZT10aGlzLlZiPSIiO3RoaXMuamU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5pZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMubGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuYWM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2I9IiI7dGhpcy5YYj0KW107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmliPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmFiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkhkPTA7dGhpcy5waD0hMTt0aGlzLm9oPTFFMzt0aGlzLkVjPSExO3RoaXMuUGE9MUUzO3RoaXMua2Q9dGhpcy5sZD0iIjt0aGlzLkRiPW51bGw7dGhpcy5HaT0hMTt0aGlzLlljPXRoaXMuUWQ9bnVsbH1jLnhqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkNhLGFkdGFncGFyYW1ldGVyOnRoaXMucGIsYWR0YWdtb2RpZmllcjp0aGlzLm9iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5lYyxhZHRhZ3JlZ2V4OnRoaXMucWQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuZmYsCnNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLHNlcnZlcjp0aGlzLmlhLHN2bUNvbmZpZzp0aGlzLlZiLGhvbWFkQWRwYXRoOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5qZSxIT01BRF9CTE9DS0VEOnRoaXMuaWUsSE9NQURfTk9CTE9DS0VSOnRoaXMubGIsSE9NQURfQURCTE9DS0VSOnRoaXMuYWMsdGVzdEhpZGU6dGhpcy5XYix0ZXN0VGFnczp0aGlzLlhiLHRlc3RUYWdzSlM6dGhpcy5ZYix0ZXN0VGFnc1hIUjp0aGlzLmJkLHRlc3QzUENvb2tpZTp0aGlzLnRjLHRocm90dGxlOnRoaXMuWmQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5uYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmFiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5iYix2cGFpZDp0aGlzLmliLHNraXBBbGxvd2VkOnRoaXMuTGYsdm1hcHM6dGhpcy5hZyxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuRWMsYWRGYWxsYmFja1VSTDp0aGlzLmxkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5rZCx5aWVsZGxhYjp0aGlzLkRifX0sUG46ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMucGI9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYKKHRoaXMub2I9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuZmY9Yi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLnpiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuVGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmVmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLlFjPWIuZ2xvYmFsQ29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuJGU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5pYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlZiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5XZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5qZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJgoodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5sYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYodGhpcy5XYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5YYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlliPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuYmQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnRjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5aZD1iLnRocm90dGxlKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuSGc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMueGM9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5zZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5XZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLmJlPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYWI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmKHRoaXMuYmI9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5pYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5MZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5hZz1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkVjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LG9tOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYWJbYV0mJjE9PXRoaXMuYWJbYV0mJihiPSEwKTtyZXR1cm4gYn0sRWY6ZnVuY3Rpb24oYil7dGhpcy5hYltiXT0hMH0sWWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuYWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5hYlthXSYmMT09dGhpcy5hYlthXSYmYi5wdXNoKGEpO3JldHVybiBifSxYZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9Zi4kayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBnPSIiLGM9IiIsZj0iIixoPSIiO2lmKCF0aGlzLkNhJiYhYSlyZXR1cm4gbmV3IEMoYik7Zz10aGlzLmNmKGIpO2M9dGhpcy5hYShiKTtnPyh0aGlzLlNjKCk/Zj1iOmY9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZj10aGlzLnFjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMucGJ8fHRoaXMub2J8fAp0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5abShoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLiRsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sY2Y6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlNjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LGRmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuY2YoYik7cmV0dXJuIGF9LCRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLlJwOwpyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxIaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGcpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxZbTpmdW5jdGlvbihiLGEpe3ZhciBkPWYuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPApoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5IaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPXRoaXMuSGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Z31sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBnPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxabTpmdW5jdGlvbihiKXt0aGlzLnBiJiYoYis9dGhpcy5wYik7aWYodGhpcy5vYilmb3IodmFyIGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm9iW2FdKSk7aWYoZi5KYylmb3IodmFyIGQ9MDtkPGYuSmMubGVuZ3RoO2QrKyl7dmFyIGc9CmYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuWW0oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmYS5YbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuV24oYi5wbGF5ZXIpO2EuZigpfX0sZzpmdW5jdGlvbihiLGEsZCxnLGMsZil7bD10aGlzO3RoaXMuZWY9ITA7dGhpcy5RYz1iO3RoaXMucWE9YTt0aGlzLnlmPWQ7dGhpcy5lZT1nO3RoaXMuaWM9Yzt0aGlzLnhhPWZ8fHt9O3RoaXMucGwoKTt0aGlzLlBtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnFhKXRoaXMuTm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuR2MoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LENsOmZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQ9ITE7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxQbTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5RYyt0aGlzLnhlKCJnbG9iYWwiKSksdGhpcy5tbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkdjKCl9LmJpbmQodGhpcyksITApfSxObTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5xYSt0aGlzLnhlKCJjbGllbnQiLAotMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuU2IoKSk7dGhpcy54YSYmdGhpcy54YS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YiYmKGQ9IiIpO3RoaXMueGEmJnRoaXMueGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5zZCl7dGhpcy5zZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZSl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0KITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuJGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTt0aGlzLkJiKCk7Zi5MYyhrLnFuKTsoYT1mLlVhKHRoaXMuSWQoKSkpfHwoYT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxtbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZz0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmCihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihhLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnFhfHx0aGlzLlZifHx0aGlzLkFhfHx0aGlzLkdjKCk6KHRoaXMuQ2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5CYigpKX19LEdjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7CnRyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGQuc2VydmVyLmxlbmd0aDthKyspe3ZhciBiPWQuc2VydmVyW2FdO3RyeXt2YXIgZTsoZT12b2lkIDA9PT1iKXx8KGU9IWIucmVwbGFjZSgiW2hhc2hdIix0aGlzLkpmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpKS5tYXRjaChSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSkpO2lmKGUpcmV0dXJuITF9Y2F0Y2goZyl7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9CihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChmLlIoIndlYi5kZSIpfHxmLlIoImdteC5uZXQiKXx8Zi5SKCJnbXguYXQiKXx8Zi5SKCJnbXguY2giKXx8Zi5SKCIxdW5kMS5kZSIpKSYmIXRoaXMuU2MoKSlmb3IoYj0wO2I8dGhpcy5pYS5sZW5ndGg7YisrKXRoaXMuaWFbYl09dGhpcy5pYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8CiExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJnRoaXMuQWEmJnRoaXMuaWEubGVuZ3RoP3RoaXMuVGMoITEpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5sYikpLHRoaXMuQmIoKSl9LGNpOmZ1bmN0aW9uKGEpe3RoaXMubGR8fCh0aGlzLmxkPWF8fCIiKX0sVGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUyl7dmFyIGU9e307aWYoYSl7dmFyIGU9bmV3IEModGhpcy5xYygpKSxkPXRoaXMuYWEodGhpcy5WYik7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtlLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2UubWV0aG9kPSJQT1NUIn1lbHNlIGU9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGUsdGhpcy5yby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTthP3RoaXMuams/dGhpcy5zYSgibm9TVk1Db25maWciKToodGhpcy5qaz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuVGMoITApfS5iaW5kKHRoaXMpLCEwKX19LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBlPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtpZighdGhpcy5uYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubmM9ITA7dGhpcy5UYyghMCk7cmV0dXJufX1lPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZT0hMCl9Y2F0Y2goaCl7fWlmKCEoZXx8CmQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2EucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5XZj10aGlzLkFiKGQuc3RyaWN0KTt0aGlzLmJlPXRoaXMuQWIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuU2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmJiPXRoaXMuQWIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkFiKGQuZW5hYmxlZCk7dGhpcy5XYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlliPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuYmQ9ZC50ZXN0YWR0YWdzeGhyfHwKW107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5wYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLm9iPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5xZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5mZj1kLmpzcG9wdXBzfHwhMTt0aGlzLnpiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLmliPWQudnBhaWR8fCExO3RoaXMueGEudnBhaWQ9dGhpcy5pYjt0aGlzLkxmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMudGQ9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmFnPWQudm1hcHN8fCIiO3RoaXMuRWM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlpkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307dGhpcy5EYj0KZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuQ28oKSYmKHRoaXMuV2J8fHRoaXMuWWJ8fHRoaXMuWGJ8fHRoaXMuYmQpP3RoaXMueWY/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5FZSgpLHRoaXMuQmIoKSk6dGhpcy51bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlRmKCkpfX0sVG06ZnVuY3Rpb24oYSl7dGhpcy5HaT0hMDt2YXIgZT1mdW5jdGlvbihhKXtpZihhPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnwgKSIrYSsiPShbXjtdKykiKSkpcmV0dXJuIGFbMl19KCJhZHBfc2VncyIpfHwiZTAiLGU9dGhpcy5EYi51cmwucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltzZWdzXSIsCmVuY29kZVVSSUNvbXBvbmVudChlKSksZT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6ZSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLnFiKGUpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07Zi5LZCh0aGlzLnFjKCksIlBPU1QiLGUsZnVuY3Rpb24oZSl7dHJ5e3ZhciBnPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe31mLnRyYWNrKCJzdGF0c19oZF95bF9kYXRhIiwhKCFnfHwhZy5sZW5ndGgpLCEwKTt0cnl7aWYoZyYmZy5sZW5ndGgmJnRoaXMuRGIucGFyYW1ldGVyKXt2YXIgaD10aGlzLkRiLnBhcmFtZXRlci5zcGxpdCgiW2lkXSIpLmpvaW4oZ1swXS5pZHx8IjAiKSxoPWguc3BsaXQoIltwcmljZV0iKS5qb2luKGdbMF0ucHJpY2V8fDApO3RoaXMucGIrPWh9fWNhdGNoKEIpe2EoKX1hKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthKCl9LmJpbmQodGhpcyksITApfSx1bzpmdW5jdGlvbigpe3RoaXMudG8oKTt0aGlzLnZvKCl9LAp2bzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGU9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cud2lkdGg9MTtnLmhlaWdodD0xO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1mLlYoMTApLGg9Zi5WKDEwKSxCPWYuVigxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJkYXRhIiwiIil9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShCKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZi5xYihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGcpfWNhdGNoKGEpe31pZigzIT0KZCl7dmFyIGI9Zi5CZCgpO2lmKChiLmlzQ2hyb21lfHxiLmlzRmlyZWZveCkmJiFiLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsZSwhMCk7cmV0dXJufXRoaXMuc2EoImNzcF8iK2UpfWYudHJhY2soInN0YXRzX2hkX2NzcCIsZSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFRmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxZZDpmdW5jdGlvbihhKXt0aGlzLnhjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkNhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYihhKSksdGhpcy5CYigpLHRoaXMuRWUoKSl9LHRvOmZ1bmN0aW9uKCl7aWYodGhpcy5XYil7dmFyIGE9Zi5CZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuQ20oKSl0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTtlLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZD0wPT09ZS5vZmZzZXRXaWR0aHx8MD09PWUub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSk7YT1kfWNhdGNoKGcpe31hP3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMubGkoKX19ZWxzZSB0aGlzLmxpKCl9LFJmOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPQpkLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy55byhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlhiPXRoaXMuYmQpJiZ0aGlzLlhiLmxlbmd0aCl7dmFyIGQ9dGhpcy5YYi5zbGljZSgpLGc9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LHlvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gYygpe3JldHVybiBmPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGYpLCEwKTohMX12YXIgZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0aGlzLkthKG5ldyBDKGEpLGcsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxsaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz0KZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuem8oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuWWImJnRoaXMuWWIubGVuZ3RoKXt2YXIgZD10aGlzLlliLnNsaWNlKCksZzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUmYoKX0sem86ZnVuY3Rpb24oYSxlLGQpe2Z1bmN0aW9uIGcoKXtmKCkmJmUoKX1mdW5jdGlvbiBjKCl7ZigpJiZkKCl9ZnVuY3Rpb24gZigpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZSxkKXtkPT1hJiZmKCkmJgpjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtnKCl9fSxRZjpmdW5jdGlvbigpe2lmKHRoaXMudGMpdHJ5e2YuS2QodGhpcy50YywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5IYj0hdGhpcy5BYihhLmNjKTt0aGlzLlRmKCl9LmJpbmQodGhpcyksdGhpcy5qaS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmppKCl9ZWxzZSB0aGlzLlRmKCl9LGppOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpO3RoaXMuRWUoKX0sQ206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sCkJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMueGMmJihlPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2UsITApO3RoaXMuQ2EmJnRoaXMuaXNFbmFibGVkJiZ0aGlzLlFkJiZ0aGlzLmNsKCk7dGhpcy50YyYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkhiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5qZSkpO3RoaXMuZWUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZSYmdGhpcy5lZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5IYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuWWM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ZYy5pZD1mLlYoMTApO3RoaXMuWWMuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLlljKTt2YXIgYT10aGlzLlljLmNvbnRlbnRXaW5kb3csZT0KYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD1mdW5jdGlvbigpe2Zvcih2YXIgZSxnPTA7Zzx0aGlzLlFkLmxlbmd0aDtnKyspZT1hLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGUudHlwZT0idGV4dC9qYXZhc2NyaXB0IixlLnNyYz10aGlzLlFkW2ddLGEuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX0uYmluZCh0aGlzKTtlLnNyYz1mLkFlKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZSk7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZi50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sb2w6ZnVuY3Rpb24oKXtpZih0aGlzLmJlJiZ0aGlzLm9tKCkpe3ZhciBhPQp0aGlzLllsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZSl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZSxkLGcsYyxoKXt0aGlzLkhkfHwodGhpcy5IZD0wKTt0aGlzLkhkKys7dGhpcy5IZD50aGlzLm9oJiYhdGhpcy5waCYmKHRoaXMucGg9ITAsZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLm9oLCEwKSk7YT1uZXcgTWEoYSxlLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpO2cmJihhLkZpPSEwKTtjJiZmLkFtKCkmJihhLlpnPSEwKTtoJiYKKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLldtfHwodGhpcy5XbT0hMCxmLkRhKCl8fGYuZWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhlPWEucmVzcG9uc2VYTUwpfHwoZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJmcuY2hpbGROb2Rlc1swXT9nLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOgoiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGUpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoZSk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsCmcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LHNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmFnfSxtbDpmdW5jdGlvbigpe3RoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuS2EoYSx0aGlzLlBvLmJpbmQodGhpcyksdGhpcy5Pby5iaW5kKHRoaXMpKX0sClBvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5KbCgpfSxPbzpmdW5jdGlvbigpe30sSmw6ZnVuY3Rpb24oKXtmLkxjKGsuSWwpO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09ZS50eXBlJiZmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09ZS50eXBlKXt2YXIgZD1uZXcgSTt3aW5kb3dbZC5nYSgpXT0KdGhpcztmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LENvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWmR9LFNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGU9IiIsZD0wO2Q8YTtkKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGV9LEFiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0iIixkLGcsYyxmLGgsayxsPTA7bDxhLmxlbmd0aDspZD0KYS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZT1lKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBlfSxhYTpmdW5jdGlvbihhKXt2YXIgZT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtlW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixlKXtiJiYoZC5xdWVyeUtleVtiXT1lKX0pO3JldHVybiBkfSxKZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBlKGEpe3ZhciBiPSIiLGUsZDtmb3IoZT03OzA8PWU7ZS0tKWQ9YT4+PjQqZSYxNSxiKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGcsYyxmPUFycmF5KDgwKSwKaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChnKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKylmW2ddPWQoZltnLTNdXmZbZy04XV5mW2ctMTRdXmZbZy0xNl0sMSk7Yz1oO249aztwPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZwfH5uJnIpK3UrZltnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnB8biZyfHAmcikrdStmW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTYwOzc5Pj1nO2crKyl2PWQoYyw1KSsobl5wXnIpK3UrZltnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLApjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihlKGgpK2UoaykrZShsKStlKG0pK2UodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnhqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLlVrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSxkKXt0aGlzLmE9YTthLmMuUD90aGlzLmdiPWEuYy5QKCk6dGhpcy5nYj0iIjthLmMud2gmJmEuYy53aCh7cGF1c2U6dGhpcy5OZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLiRoLmJpbmQodGhpcyksbXV0ZTp0aGlzLm9mLmJpbmQodGhpcyksCnVubXV0ZTp0aGlzLkpvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEuc2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5qYz10aGlzLnJkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9ZTt0aGlzLmpiPXt9O3RoaXMudmlkZW89e307dGhpcy5WZD17fTtmLnZiKCJuZXdCaWdBZElkIik7dGhpcy5ibD1mLlYoMTApO3RoaXMuTmY9MDt0aGlzLm9kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMub2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMub2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuVGs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5XYz10aGlzLlVkPSExO3RoaXMuRmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy53ZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMub2M9ITE7dGhpcy56bD1mLlYoMTApO3RoaXMuUmI9Zi5WKDEwKTt0aGlzLlBiPWYuVigxMCk7dGhpcy5laT1mLlYoMTApO3RoaXMuY29uZj17fTt0aGlzLmZlPXRoaXMuJGI9dGhpcy5JZT10aGlzLnlkPXRoaXMuV2Q9dGhpcy5DYj10aGlzLnZjPXRoaXMuT2g9dGhpcy5IZT10aGlzLkRkPXRoaXMuRG89dGhpcy5GYj10aGlzLlFiPSExO3RoaXMuQWM9W107dGhpcy5wYz17fTt0aGlzLm1uPTIwMDt0aGlzLmRnPXRoaXMuZGQ9dGhpcy5GYz10aGlzLmNnPXRoaXMueGY9ITE7dGhpcy5xZj17fX1jLnJqPWE7YS5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihlPQp0aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBlfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5OYiYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMua28oKTtmLm8oay5Layx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqZjpmdW5jdGlvbihhLGUsZCxnKXt0aGlzLkZiPWQ7dmFyIGM9ITE7ZyYmZy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGM9ITApO2lmKHRoaXMuQS5TKXRoaXMuTmYrKyxmLnZiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxnPWwuZ2V0Q29uZmlnKCksZi5PZyYmKHRoaXMuQS5Qbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5BLkNhJiZ0aGlzLkEuaXNFbmFibGVkPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCwKa2VlcFVSTDplLGJpdHJhdGU6Zy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5pYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTplPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaWIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpnLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5RYSgpO2Vsc2V7dmFyIGg9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmNvKHRoaXMuYik7dGhpcy5raChhKTt0aGlzLkFjPXRoaXMuYWgoYSk7dGhpcy5zbCgpfSxraDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmltKGIpKSx0aGlzLmtoKGIucGFyZW50KSl9LGFoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5haChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlRsKGIpKSk7cmV0dXJuIGV9LFRsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLmtwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmNuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5IbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMubG8oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Rbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsubHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5vcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLk1vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLk5vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sY286ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuamIuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS5ycT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlRrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk9rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5taShlKSl7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5SayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmpiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuamIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuYW8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sYW86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuU2sodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5QaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMueWkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLmxtKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5abygpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuQ2ksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5jcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaHAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZ3AoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5pcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5lcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5EaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGUpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmFwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LCRvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0sYXA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sYnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LFpvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuZ2koKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxncDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxpcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LERpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LFlvOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsuanAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkRpKCEwKX0sT2s6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBlPWIuYWEoYSk7cmV0dXJuIGUucHJvdG9jb2wrIjovLyIrZS5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLlVvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbWk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFJrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5CaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQWk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm1pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlNvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLlJvKCk7dGhpcy55aSgpO3RoaXMuQmcoKTt0aGlzLmEuUGgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5kaSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuYmImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LExrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZmgoYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5pbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuTGsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5nbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuamIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS52aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlloKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkloKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sVW86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQmk6ZnVuY3Rpb24oKXtpZih0aGlzLkRvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5HbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5DaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmpiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLnZpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxzaTpmdW5jdGlvbigpe3RoaXMuT2h8fCh0aGlzLk9oPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxHbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudGl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnNpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuZ2koKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5iYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy50aT1hKX0sZmk6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxrbzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sZ2k6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LGxvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5iYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5iYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLnltKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGUpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkRsKHRoaXMuYi5PYSxhKX1jYXRjaChCKXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5OayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLlBrKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5YaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxQazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFhoOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sbm86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sam06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxEbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxTbzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy56aS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnppLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sUm86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuJGcoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm5pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Fby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5laTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LG9pOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LEVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sRm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxKbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuSG0oKSYmdGhpcy5HbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLkhvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LEhtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuaWJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5pYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5pYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxHbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sWmw6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LEhvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmlmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7fXRoaXMueGQoKX12YXIgZT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMsZD10aGlzLlpsKCk7dGhpcy5GYz10aGlzLldjPXRoaXMuZGQ9dGhpcy5kZz0hMDtyZXR1cm4gZT8oZi5lYigiaHR0cHM6Ly93d3cud2VsZWN0LmRlL2FwaS92MS9wcmVmbGlnaHQvYnlfYWxpYXMvIitlLCJkZXdlbGVjdHd3d3dlbGVjdGRlIix7fSxhLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpLHRoaXMuQSksITApOiExfSxMZzpmdW5jdGlvbihhKXt0aGlzLm5vKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZyghMCl9LmJpbmQodGhpcyksCnRoaXMubW4pOih0aGlzLldkPSEwLHRoaXMuYS5WZSgpLHRoaXMuYS5NbigpLHRoaXMub2M9ITEsYT10aGlzLmIuc3x8e30sdGhpcy5IZXx8KGEubm9Db21wbGV0ZVF1YXJ0aWxlPSEwKSxmLm8oay55bCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMuUmUoKS5ZaCgpKX0sUmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZi5hZih0aGlzLnZpZGVvLGEpP3RoaXMuJGgoKTp0aGlzLk5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIucmIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuRWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmCihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuQWMmJjA8dGhpcy5BYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuQWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sdTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYmwrIi0iK3RoaXMuTmY7dGhpcy5iJiZ0aGlzLmIuZ2gmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLmdoKCkpO3JldHVybiBhfSxSZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMucmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMucXB8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsZCxjKXt0aGlzLm9wdGlvbnM9Y3x8e307ZT1kO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm9hPW51bGw7dGhpcy5ZPVtdO3RoaXMuSj1udWxsO3RoaXMuemM9dGhpcy5CYz0hMTt0aGlzLmJhPSIiO3RoaXMuYmc9ITE7dGhpcy5yaD0iIjtjJiZjLmVtcHR5P3RoaXMuU20oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxlLGQ9W107Yy5zaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpLGI7Yj1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBlPSIiO2IucXVlcnlLZXkmJihlPWIucXVlcnlLZXkuaHZwKTtlJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBDKHRoaXMudXJsKTpsLnZhKGwuWGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7CnZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52cGFpZCYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfS5iaW5kKHRoaXMpLGM9ZnVuY3Rpb24oKXtyZXR1cm4gZCgpJiYoZi5SKCJtYXJ0aGFzdGV3YXJ0LmNvbSIpfHxmLlIoImZhbmRvbS5jb20iKXx8Zi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKX0uYmluZCh0aGlzKTtpZihkKCl8fGMoKSl7dmFyIGg9Zi5OZyh0aGlzLnVybCk7aHx8KGg9dGhpcy51cmwpO3ZhciBjPWZ1bmN0aW9uKCl7cmV0dXJuIDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4gMDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksbT1mdW5jdGlvbigpe3JldHVybihmLlIoImdpZ2EuZGUiKXx8Zi5SKCJraW5vLmRlIil8fGYuUigic3BpZWxldGlwcHMuZGUiKXx8Zi5SKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbj1mdW5jdGlvbigpe3JldHVybiAwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil8fDA8aC5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfS5iaW5kKHRoaXMpO2lmKGMoKXx8aygpfHxtKCl8fCJhcHBzcG90Ij09ZSluKCk/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5YZChoKSkrIiZ0eXBlPWpzIixiPWwudmEobC5YZCh0aGlzLnVybCksCiExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGYudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPWwudmEobC5YZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLlJtLmJpbmQodGhpcyksdGhpcy5PbS5iaW5kKHRoaXMpKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMub2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmCmEuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09Zi5OYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZVtiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goYyl7ZVtiXT17fX1lbHNlIGUuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZT1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSwKYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWYuTmJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1mLk5ifHx0aGlzLkVtKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLnNvKCkpdHJ5e3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1jLmxlbmd0aCYmKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrY1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1nLmZpcnN0Q2hpbGQ7ZS5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksCmI9MDtiPGEubGVuZ3RoO2IrKyllLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGUpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LEVtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sZT10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrCjYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9ZT8hMDohMX0sUm06ZnVuY3Rpb24oYSl7dGhpcy54bihhKTt0cnl7dGhpcy5vYT1hLnJlc3BvbnNlWE1MLHRoaXMub2F8fCh0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5yaD1hLnVybENhbGxlZDtpZih0aGlzLlkubGVuZ3RoKXRoaXMuVmMoKTtlbHNle3RoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKTt0cnl7Zi50cmFjaygic3RhdHNfaGRfbXR5dXJsIixmLlVhKHRoaXMuYmEpLCEwKX1jYXRjaChlKXt9fX0sU206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMub2F8fAoodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5ZLmxlbmd0aD90aGlzLlZjKCk6dGhpcy5yYSh0aGlzLlJhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5uZTpGLmdnfSkpfSxPbTpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5SYSh2LmZnLHtkZXB0aDpifSkpfSxWYzpmdW5jdGlvbigpe3RoaXMuSj10aGlzLlkuc2hpZnQoKTt0aGlzLkltKCk/dGhpcy5BbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLmxoKCksZSx7QWRTeXN0ZW06dGhpcy5TbCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuUmEodi5pZykpOihiPTAsdGhpcy5LbygpJiZ0aGlzLnVmKHRoaXMuQmwoKSkpfSxwZjpmdW5jdGlvbigpe3RoaXMuQmM/KHRoaXMuQmM9MTx0aGlzLlkubGVuZ3RoLAp0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LnBmKCl9LEloOmZ1bmN0aW9uKCl7dGhpcy56Yz8odGhpcy56Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5JaCgpfSxLbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhvKCk/dGhpcy53bygpPyEwOigtMSE9dGhpcy5OYygpP3RoaXMucmEodGhpcy5SYSh2LmhlKSk6dGhpcy5yYSh0aGlzLlJhKHYuZWcpKSwhMSk6KHRoaXMucmEodGhpcy5SYSh2LmZkLEYuaGcpKSwhMSl9LHVmOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmdlfHwoYS5nZT1bXSk7YS5nZS5wdXNoKHRoaXMucmgpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5sZigpKTthLkViPWEuRWI/YS5FYjp0aGlzLkJjO2EueWM9YS55Yz9hLnljOnRoaXMuemM7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT8KYS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzt0aGlzLnBhcmVudC51ZihhKX0sQmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZHVyYXRpb249dGhpcy5OYygpO2EuTj10aGlzLmloKCk7YS5yYj10aGlzLlVsKCk7YS55cT1bXTthLm9yaWdpbj10aGlzO2Eucz10aGlzLlJsKCk7YS5NZj10aGlzLmhtKGEuZHVyYXRpb24pO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztyZXR1cm4gYX0scmE6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPQphLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7aWYoIXRoaXMuSiYmdGhpcy5vYSYmdGhpcy5vYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLm9hO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGU9ITE7KGU9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZS5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuT2E9YS5lcnJvci5jb2RlIT12LmhlLmNvZGU/YS5PYS5jb25jYXQodGhpcy5WbCgpKTphLk9hLmNvbmNhdCh0aGlzLmRtKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQua2MmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5rYyYmdGhpcy5wYXJlbnQua2MoYSksYj0wLHRoaXMuVmMoKSk6KHRoaXMucGFyZW50JiYKdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sa2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQua2MoYSl9LFVnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLlJhKGEsYikpfSxSYTpmdW5jdGlvbihhLGIpe3ZhciBlPW5ldyBUYShhLGIpO2Uub3JpZ2luPXRoaXM7cmV0dXJuIGV9LEFvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmloKCkubGVuZ3RofSx3bzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuTmMoKX0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxraTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuU2YoKSYmCihhPSEwKTtyZXR1cm4gYX0seG46ZnVuY3Rpb24oYSl7dGhpcy5iYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLmJhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuYmE9IlVOS05PV04ifXRyeXt0aGlzLmJnPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGUpe319LEltOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5saCgpLmxlbmd0aH0sbGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSxTbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBkPWFbZV07W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7dHJ5e2lmKCJUcmFja2luZyI9PWQmJmEmJmEucGFyZW50Tm9kZSYmIlRyYWNraW5nRXZlbnRzIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lJiYoYS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJOb25MaW5lYXJBZHMiPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZXx8YS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJDb21wYW5pb24iPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpcmV0dXJufWNhdGNoKGUpe31pZihhJiYhdGhpcy55aChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy50YihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LHloOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT0KYS5ub2RlTmFtZT8hMDp0aGlzLnloKGEucGFyZW50Tm9kZSk6ITF9LGRtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxVbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxpaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKWIucHVzaCh7aWQ6YVtlXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2VdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbZV0uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtlXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksCmhlaWdodDphW2VdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksU3A6YVtlXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMudGIoYVtlXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUGF8fDFFMzt0cnl7dmFyIGM9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlBhKS1NYXRoLmFicyhkLWIuUGEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWMuY29uY2F0KGYpfWNhdGNoKGgpe31yZXR1cm4gYn0sUmw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGU9ITEsZD1bXSxiPSExLGM9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Yz1iPXRoaXMuR2QoYVtoXSk7dHJ5e2U9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtlPWJ9ZC5wdXNoKGUpO2YucHVzaChjKX0xPGEubGVuZ3RoPyhiPWQsaD1jKTooYj1lLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMudGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxobTpmdW5jdGlvbihhKXt2YXIgYj0hMSxlPSExLGQ9ITE7dHJ5e2U9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWUuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1mLmhvKGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGMpe2I9ITF9cmV0dXJuIGJ9LFFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy50YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sVGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuR2QoYSk6IiJ9LEdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuVGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLnNrfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuUGx8fFVhO25ldyBVYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTj1bXTt0aGlzLnJiPSIiO3RoaXMucz10aGlzLnljPXRoaXMuRWI9ITE7dGhpcy5YZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuWWU9IiJ9Yy5Zaj1hO2EucHJvdG90eXBlPXt2bDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk4ubGVuZ3RoO2UrKylpZigwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxibTpmdW5jdGlvbigpe2lmKCF0aGlzLlhlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ub2Epe3ZhciBhPXRoaXMub3JpZ2luLm9hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxlPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKykoZT1hW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWUuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuWGU9YVtkXSl9cmV0dXJuIHRoaXMuWGV9LApnaDpmdW5jdGlvbigpe2lmKHRoaXMuWWUpcmV0dXJuIHRoaXMuWWU7dmFyIGE9IiI7KGE9dGhpcy5ibSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuWWU9YX0sbG06ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk5bZV07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLllqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLmFsfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt2YXIgdj17b2U6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsTmE6IlhNTF9QQVJTRV9FUlJPUiJ9LGVnOnt0eXBlOiJlcnJvciIsY29kZToyMDIsCm1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTmE6IkRVUkFUSU9OX0VSUk9SIn0sZmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE5hOiJFTVBUWV9WQVNUIn0saWc6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTmE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LGZnOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApOYToiTE9BRF9FUlJPUiJ9LGtlOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixOYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LHNwOnt0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE5hOiJNRURJQUZJTEVfRVJST1IifSxoZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixOYToiRFVNTVlfQUQifX0sRj17Z2c6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixOYToiTk9fQURTIn0saGc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE5hOiJOT19NRURJQUZJTEVTIn0sdHA6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE5hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sbmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTmE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2E9Yy5HbHx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmVycm9yPWE7dGhpcy5BZD1lO3RoaXMuT2E9W107dGhpcy5vcmlnaW49bnVsbH1jLmhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5oanx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWGE9CmMubGt8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5aaD1hO3RoaXMudmlkZW89ZTt0aGlzLmNlPVtdO3RoaXMuV2g9W107dGhpcy5yZj1bXTt0aGlzLlRvPSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5JKCl9Yy51cD1hO2EucHJvdG90eXBlPXtJOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLlpoLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuWmhbYV0sZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCwKYz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7dmFyIGg9Zi5jb250ZW50V2luZG93O2gubnE9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuSm4uYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuQ24uYmluZCh0aGlzKX07dmFyIGs9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7ay5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Euc3JjPWQ7aC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2guZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTsKdGhpcy5jZS5wdXNoKHtzcmM6ZCxmcmFtZTpmLG5uOmMsdmVuZG9yOmUuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLnJmLmxlbmd0aDtlKyspe3ZhciBkPXRoaXMucmZbZV07ZC50eXBlPT09YSYmZC5mbCh0aGlzLldsKGEpKX19LFdsOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e3dxOiEwLHZxOjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e2txOiJ2aWRlbyIsenE6ImpzQ3VzdG9tIixBcToiMS4wLjAtZGV2In19O2Nhc2UgInN0YXJ0IjpyZXR1cm57dHlwZToic3RhcnQiLGRhdGE6e2R1cmF0aW9uOjEwLEJxOjEsVHA6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIiwKZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sa206ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLmNlLmxlbmd0aDtlKyspaWYodGhpcy5jZVtlXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLmNlW2VdLm5uO3JldHVybiIifSxKbjpmdW5jdGlvbihhLGUpe3RoaXMuV2gucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMua20oZSksdmVuZG9yOmV9KTt0aGlzLmpvKCl9LENuOmZ1bmN0aW9uKGEsZSl7InZpZGVvIj09PWE/dGhpcy5Uby5tYXAoZnVuY3Rpb24oYSl7dGhpcy56ZyhhLGUpfS5iaW5kKHRoaXMpKTp0aGlzLnpnKGEsZSl9LHpnOmZ1bmN0aW9uKGEsZSl7dGhpcy5yZi5wdXNoKHt0eXBlOmEsCmZsOmUsdHE6ITF9KX0sam86ZnVuY3Rpb24oKXt0aGlzLldoLm1hcChmdW5jdGlvbihhKXthLkJtfHwoYS5tcSh7YWRTZXNzaW9uSWQ6Zi5WKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS54cSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuQm09ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmpuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWE9Yy5qbnx8WWE7bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmNvbmY9ZXx8e307dGhpcy5jPWE7dGhpcy5zYj1hLmRoKCk7dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSC5pZD0KZi5WKDEwKTt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5IYT17fTt0aGlzLkFnPSExO3RoaXMuZmM9W119Yy5laj1hO2EucHJvdG90eXBlPXtRbDpmdW5jdGlvbihhKXt2YXIgZT17fSxkPSExLGM9MCxlPTAsZj17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPSJmaXhlZCIsYz1lLmxlZnQsZT1lLnRvcCk7Zj17eDpjLHk6ZX07Zi5wb3NpdGlvbj1kO3JldHVybiBmfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlFsKGEpO2Zvcih2YXIgZT0wLGQ9MCxjPSExLGY9dGhpcy5xbShhKSxoPXt9O2E7KWUrPWEub2Zmc2V0TGVmdCsKYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZiYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxlKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxkKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihjPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmUseTpkfTtjJiYoaC5wb3NpdGlvbj1jKTtyZXR1cm4gaH0scW86ZnVuY3Rpb24oKXt0aGlzLkFnPSEwfSx2aTpmdW5jdGlvbigpe3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwKIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5jLmwoKSl9LE1uOmZ1bmN0aW9uKCl7dGhpcy5BZ3x8KHRoaXMuYy5wbGF5KCksZi5vKGsud2QsdGhpcy5jLmwoKSkpfSxLZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5jLnBhdXNlKCk7dGhpcy5ILnN0eWxlLnpJbmRleD1hO3RoaXMuSC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkguc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSC5zdHlsZS5ib3hTaXppbmc9dGhpcy5zYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuc2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkIuc3R5bGUud2lkdGg9dGhpcy5zYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLnNiKTt0aGlzLmMuWmMmJnRoaXMuYy5aYygpP3RoaXMuYy5kaCgpLmFwcGVuZENoaWxkKHRoaXMuSCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkgpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5jLmV4aXRGdWxsc2NyZWVuKCl9LHFtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8ZSYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPQohMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sTmw6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5nZXRQb3NpdGlvbihhKTtlLnBvc2l0aW9uP2UucG9zaXRpb249ZS5wb3NpdGlvbjplLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZS53aWR0aD1hLm9mZnNldFdpZHRoO2UuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBlfSxtYzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLk5sKHRoaXMuc2IpO2lmKGUueCE9dGhpcy5IYS54fHxlLnkhPXRoaXMuSGEueXx8ZS5wb3NpdGlvbiE9dGhpcy5IYS5wb3NpdGlvbnx8ZS53aWR0aCE9dGhpcy5IYS53aWR0aHx8ZS5oZWlnaHQhPXRoaXMuSGEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuSGEud2lkdGgmJjA8dGhpcy5IYS5oZWlnaHQmJjA9PWUud2lkdGgmJjA9PWUuaGVpZ2h0KXt0aGlzLlZlKCk7cmV0dXJufXRoaXMuSGE9ZTt0aGlzLmMuWmMoKT8odGhpcy5ILnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5ILnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSC5zdHlsZS5sZWZ0PQplLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWUueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZS5wb3NpdGlvbjt0aGlzLkIuc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5mYy5sZW5ndGg7YSsrKXRoaXMuZmNbYV0oe3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSl9Zi5QZih0aGlzLkgpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSx5ZzpmdW5jdGlvbihhKXt0aGlzLmZjfHwodGhpcy5mYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuZmMucHVzaChhKX0sVmU6ZnVuY3Rpb24oKXt0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTsKdGhpcy5CJiZ0aGlzLkIucGF1c2UmJnRoaXMuQi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuZWp8fFphLEQ9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWYuVigxMCk7TS5jb250cm9scz0hMDtELnB1c2goTSl9dmFyIEo9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYj1jLmFufHxhYjtuZXcgYWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwoYT10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3RoaXMuVChiKTt0aGlzLlJkKGEpO3RoaXMuUGcoKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZHx8KHRoaXMuaWQ9YSl9LFBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5UYSgpLGI9dGhpcy52aWRlb1RhZztifHwoKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiZhLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wYXJhbWV0ZXJzJiYhMT09PWEucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxlPXRoaXMuVGEoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7YS5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYX19KX0pKGMpOwp2YXIgYmI9Yy5Tanx8YmI7KGZ1bmN0aW9uKGMpe2MuUmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5kYz10aGlzLmRjfHwhMTt0aGlzLnFnPXRoaXMuc2c9dGhpcy52aD10aGlzLnphPXRoaXMuVWY9ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5MbChhLGIpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52aCYmdGhpcy5HZygpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLk1iO2EmJmEub2MmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudWQoKTt0aGlzLnZoPSEwO3RoaXMuR2coKX0uYmluZCh0aGlzKSk7dGhpcy5EZygpfSxHZzpmdW5jdGlvbigpe2lmKCF0aGlzLmRjKXt0aGlzLnVkKCk7aWYoIXRoaXMuVWYmJiF0aGlzLnVkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5VZiYmdGhpcy5xZyYmIXRoaXMuc2cmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSx1ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYSYmYS5hZE1hbmFnZXJzJiZhLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0samg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmU9MDtlPGIubW9kdWxlcy5sZW5ndGg7ZSsrKXt2YXIgYz1iLm1vZHVsZXNbZV07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LERnOmZ1bmN0aW9uKCl7aWYodGhpcy51ZCgpKXt2YXIgYT10aGlzLmpoKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuc2c9MDxhLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5xZz1hLlFwfXRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzQWRQbGF5aW5nP2EuaXEoKTohMX0sTmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QWREdXJhdGlvbj9hLk5jKCk6LTF9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzUGxheWluZyYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxMbDpmdW5jdGlvbihhLGIpe3RoaXMuZGM9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5kY3x8MzAyPT10aGlzLmRjP3RoaXMuemE9ITA6dGhpcy5tKCJhZGVycm9yIix0aGlzLmRjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfSx2ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT8odGhpcy53KCksdGhpcy5qYSgpKTphLlplKCk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuZW0oYSk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIGNiPWMuUmp8fGNiOyhmdW5jdGlvbihjKXtjLlRqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sRG06ZnVuY3Rpb24oKXt3aW5kb3cuT08uY2suR2suRWs/d2luZG93Lk9PLmNrLkdrLkVrLk9wKGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRtKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZhPTE1MDA7dmFyIGE9ZGEoKTtpZihhJiZhLl9faW50ZXJuYWwmJmEuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGYuU2UoYS5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYiBpbiBhLl9faW50ZXJuYWwucGxheWVycylpZihhLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGU9bmV3IGJiKGEuX19pbnRlcm5hbC5wbGF5ZXJzW2JdKTt0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBjYihlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgZGI9Yy5Uanx8ZGIsZWI9bmV3IGRiKHQpO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmxufHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5XaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLmhhPSExO3RoaXMubWgoKX0sbWg6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2F8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpOwphJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1oKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuU2goKX0sU2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYT90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2goKX0uYmluZCh0aGlzKSwKMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5XaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuVmk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sRGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5jb2RlLGU9YS5tZXNzYWdlO2EuZGF0YSYmKGI9YS5kYXRhLmNvZGUsZT1hLmRhdGEubWVzc2FnZSk7MTIwNSE9YiYmKDkwMD09YiYmMDxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKSk6MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/dGhpcy5qYSgpOnRoaXMuaSgpKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHMpO2EucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLkRlKGEpfS5iaW5kKHRoaXMpKTsKYS5wbGF5ZXIub24oInBsYXlpbmciLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRlKGEuYWRFcnJvckV2ZW50cyl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuVml8fGhiOyhmdW5jdGlvbihjKXtjLlhpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLlJkKE1hdGguY2VpbCgxRTEwKgpNYXRoLnJhbmRvbSgpKSksdGhpcy5MKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5VaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pO3RoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliLFQ9bmV3IGliKHQpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuYmt8fApqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubmt8fFU7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5uZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5obihhKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKdy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0saG46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZTtmb3IoZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkpe2I9aXNOYU4oYVtlXSk/ITE6YVtlXTtpZigxMDA5PT1hW2VdfHwxMDAxPT1hW2VdfHwzMDM9PWFbZV18fDQwMz09YVtlXSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGMgaW4gYVtlXSlpZihhW2VdLmhhc093blByb3BlcnR5KGMpJiYoYj1pc05hTihhW2VdW2NdKT8hMTphW2VdW2NdLDEwMDk9PWFbZV1bY118fDEwMDE9PWFbZV1bY118fDMwMz09YVtlXVtjXXx8NDAzPT1hW2VdW2NdKSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMubWt8fFY7KGZ1bmN0aW9uKGMpe2Mub2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLk1kJiYoYT1mLkVsKGEsdGhpcy5NZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTChkKTt2YXIgZz1uZXcgVihkLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuTWR8fAoodGhpcy5NZD1bXSksdGhpcy5NZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5LKGQpfHwodGhpcy5MKGQpLGc9bmV3IFYoZCx0aGlzLkYpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLk8oKX0sbmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwodGhpcy5jYVthXT17fSk7dGhpcy5jYVthXVtiXXx8KHRoaXMuY2FbYV1bYl09W10pO3RoaXMuY2FbYV1bYl0ucHVzaChjKX0sQm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYl0pdGhpcy5VY3x8KHRoaXMuVWM9W10pLHRoaXMuVWMucHVzaChhKSx0aGlzLkxuKCkmJih0aGlzLkFmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYl1bY10mJjA8dGhpcy5jYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPQowO2Q8dGhpcy5jYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuY2FbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9YS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ3LkJvKGEpfX0pfSkoYyk7dmFyIGtiPWMub2t8fGtiLHc9bmV3IGtiKHQpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5tcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMubXB8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sCnVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5TaXx8bWI7KGZ1bmN0aW9uKGMpe2MuVGk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2YuSmMucHVzaCh7Ilt3aWR0aF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRXaWR0aH0pO2YuSmMucHVzaCh7IltoZWlnaHRdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0SGVpZ2h0fSk7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkOwphLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5UaXx8bmI7KGZ1bmN0aW9uKGMpe2MuVWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZCk7dGhpcy5LKGgpfHwodGhpcy5MKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5MYSlpZihiPT10aGlzLkxhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5VaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMubnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLm5wfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Paj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy50bHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudWwoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSWcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz0KYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsaD1hLnNvdXJjZS5DSE9PU0VSX1RJTUV8fCIiO2YudHJhY2soInN0YXRzX2Nob29zZXJfYWIiLGMsITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfaW50ZXJhY3Rpb24iLGMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLklnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuQm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy5oYz1bXSk7dGhpcy5oYy5wdXNoKGEpfSx1bDpmdW5jdGlvbigpe2lmKHRoaXMuaGMmJnRoaXMuaGMubGVuZ3RoKWZvcih2YXIgYT0KMDthPHRoaXMuaGMubGVuZ3RoO2ErKyl0cnl7dGhpcy5oY1thXSgpfWNhdGNoKGIpe319LEZkOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylyZXR1cm4gdGhpcy5LYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEJuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuT2p8fHJiOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpO3RoaXMuRWk9ITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMuRWkmJih0aGlzLmkoKSx0aGlzLkVpPSEwLHRoaXMubmEoKSk7Yi5UYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSmV8fCh0aGlzLkplPTEpLHRoaXMuSmUrKywxMDA8dGhpcy5KZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTmp8fHNiOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT0KYSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHJiKGFbZF0pLHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLlBqfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlBpfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmI7KGZ1bmN0aW9uKGMpe2Mud2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LHpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuem4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuQ2Mpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtCjE7YisrKTEwMDkhPXRoaXMuaGJbYl0mJjMwMyE9dGhpcy5oYltiXSYmNDAzIT10aGlzLmhiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy53a3x8d2I7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuSyhjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IHdiKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciB4Yj1jLnlrfHwKeGIseWI9bmV3IHhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMuTWp8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnZmPSExfSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zbigpfS5iaW5kKHRoaXMpLDUwMCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLApiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnZmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnZmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmCmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LG1vOmZ1bmN0aW9uKCl7dGhpcy52Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuaGt8fEFiOyhmdW5jdGlvbihjKXtjLmdrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5WbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudWN8fCh0aGlzLnVjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLnVjfHx0aGlzLnVjKyssdGhpcy51Yzw9dGhpcy5WbT8odGhpcy51YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuZ2t8fEJiOyhmdW5jdGlvbihjKXtjLmlrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuaWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLlFqfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5laz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5la3x8RmI7KGZ1bmN0aW9uKGMpe2MuZGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVGEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLndsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5NbSgpOnRoaXMuRmcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSx3bDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkliKCk7IWEucGEmJmEuWSYmYS5OcCYmYS5QcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEZnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCl9LmJpbmQodGhpcyksMTAwKX0sSWI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5JYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5UYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sanE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSWIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuZGt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbmw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTChhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLm5sKGFbYl0pO3RoaXMuTygpfX0pO2MuZ2QuSWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy5wcHx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuS2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0saHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sWmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVGE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLktqfHxYOyhmdW5jdGlvbihjKXtjLkpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLndmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMud2Y9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy53ZiYmYyE9dGhpcy53Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLlIoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLm9xKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmp8fFk7KGZ1bmN0aW9uKGMpe2MuTGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLkFmKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMuTGp8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5Wb3x8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5wanx8TmI7KGZ1bmN0aW9uKGMpe2Mub2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTT10aGlzLk18fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxDZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkNlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLm9qfHxPYjsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTmIoYVtiXSk7Yy5oYXx8dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgT2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFBiPWMucWp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmZrfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT8oYz1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuWml8fFNiOyhmdW5jdGlvbihjKXtjLiRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy4kaXx8VGI7KGZ1bmN0aW9uKGMpe2MuYWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGM9bmV3IFNiKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSx3aW5kb3cuYnJpZHBsYXllcj1jLChuZXcgVGIoYyx0aGlzLkYpKS5mKCkpfX10aGlzLk8oKX19KX0pKGMpO3ZhciBVYj1jLmFqfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMuV2t8fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSxhZTpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LEFuOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuQmt8fFhiOyhmdW5jdGlvbihjKXtjLkFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0sZ2M6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkhrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuSGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmdjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuRG4oKX0sRG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55bj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy55bj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmdjKGEpKX19KX0pKGMpO3ZhciBZYj1jLkFrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhLkFuKCksYT1uZXcgWWIoYSx0aGlzLkYpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFpiPWMuQ2t8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5rbnx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy4kbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLiRkKGEpfS5iaW5kKHRoaXMpKX0sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5xa3x8TjsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuT2UpaWYodGhpcy5PYnx8Cih0aGlzLk9iPTApLHRoaXMuT2IrKywxNTx0aGlzLk9iKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLlpuKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5NKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5NPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMucGt8fE87KGZ1bmN0aW9uKGMpe2Mucms9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuQWYoKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBiYz1jLnJrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5GbHx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Hanx8WjsoZnVuY3Rpb24oYyl7Yy5Gaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuTT10aGlzLk18fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuU2IoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy55YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx5YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTT1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRmp8fGFhOyhmdW5jdGlvbihjKXtjLkhqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuSGp8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLklvfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLm1qfHxoYzsoZnVuY3Rpb24oYyl7Yy5saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5FZygpfSxFZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMubGp8fAppYzsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLkwoYSk7KG5ldyBpYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGpjPWMubmp8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLnJwfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLklpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5CZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnphPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5CZS5iaW5kKHRoaXMpLDEwMCl9LEJlOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5IaXx8bmM7KGZ1bmN0aW9uKGMpe2MuSmk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxTYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBuYyhhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgb2M9Yy5KaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuTWl8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5PZD1bXTt0aGlzLnpmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy4kaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmZtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnpmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy56ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5PZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxmbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy56ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxvbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5PZC5sZW5ndGg7YSsrKXRoaXMuT2RbYV0uWmImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZFthXS5aYil9fX0pKGMpO3ZhciByYz0KYy4kanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkttPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy5LbXx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGsuTG8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGsuZW4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTmUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5kanx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLkxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi52YigibmV3QWRkZWxpdmVyeSIpfWMuS2k9YTthLnByb3RvdHlwZT17Vm46ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApSbjpmdW5jdGlvbihhKXt0aGlzLkxiPWF9LFFuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LCRjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnVtKCkpdGhpcy5MYi5nKHRoaXMuTGIuUWMsdGhpcy5MYi5xYSx0aGlzLkxiLnlmLGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTGIuaWMpO2Vsc2UgaWYobC5EYiYmIWwuR2kpbC5UbShmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhrLkhjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5xbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTGIsaCk7bS5Obih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmdmJiYoZD10aGlzLnBsYXllci5nZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5qZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx1bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LGZvOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuJGMoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX0sZW86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRmYoInBvc3Ryb2xsIik7Zi52YigicG9zdHJvbGwiKTt0aGlzLlZuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLiRjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxHbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmJvKHRoaXMuZW8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sVGQ6ZnVuY3Rpb24oYSl7Zi52YigibWlkcm9sbCIpO2YuRmYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy4kYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxGbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLlVuKHRoaXMuVGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubWYoKX0sZjpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLnBsYXllci5tZiYmdGhpcy5GbigpO3RoaXMuR24oKX19fSkoYyk7dmFyIGZhPWMuS2l8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy55anx8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGJhZXJhZUhpVGhlcmVpbmcsYmFlcmFlSGlUaGVyZWluZyk7Cg==
- 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
H2
|
200
|
5303510603
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
205 B
|
21ms
21ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/
Frame CBD8
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:819::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
|
sodar
Show response
pagead2.googlesyndication.com/getconfig/
Frame 6944
|
7 KB
5 KB
|
19ms
19ms
|
XHR
application/json |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020022701&st=env
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js?21065627
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 7350b2da3a9331eab4f610761a72e897f2cb4a7e459eb46d8d0238cb55466ccd
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
data
lb46.s400.meetrics.net/
|
43 B
308 B
|
26ms
26ms
|
Image
image/gif |
136.243.3.132
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
data
lb46.s400.meetrics.net/
|
43 B
308 B
|
26ms
26ms
|
Image
image/gif |
136.243.3.132
HETZNER-AS
|
|
General
- Full URL
- https://lb46.s400.meetrics.net/data?/K06kHWZAA/k0FkQmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A0zA2wAmvFytFh0FjvFklF94Et1EurFuvF3uFtzAx4EzxAmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF91AzwAz1AxwA2wAzmAjpFk9BxzA4zAwzA34Ay5Az4AmzEp6Fl9BzxA4zBxmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1zAwzA1xAw2AwzAmhEwkF91AzwAz1AxwA2wAzmAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A02A5zAmvFytFh0FjvFklF94Et1EurFuvF3uFtzAz4EzxAmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF91AzwAyzA00A3xA3mAjpFk9BxzA4zAwzA0xA30Ay1AmzEp6Fl9BzzA4zBxmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9zEr5FmhEwjF91AzwAyzA00A3xA3mAhwFk9B1zAwyAz0A03Ax3AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A04AzwAmvFytFh0FjvFklF94Et1EurFuvF3uFtzA04EzxAmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF91AzwAz1AxwA15A3mAjpFk9BxzA4zAwzA0xA23A3xAmzEp6Fl9Bz0A4zBxmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9yEljF0hFunFslFmhEwjF91AzwAz1AxwA15A3mAhwFk9B1zAwzA1xAw1A53AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A11A4xALlnFETkzFARksFAQtjFeZh9YA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.132
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h224.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
sodar2.js
Show response
tpc.googlesyndication.com/sodar/
Frame 6944
|
14 KB
5 KB
|
39ms
38ms
|
Script
text/javascript |
2a00:1450:4001:819::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js?21065627
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/
Frame 9DDA
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:819::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
Frame B57A
|
0
60 B
|
16ms
16ms
|
Image
image/gif |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gpt_2020022701&jk=3831497916287387&bg=!dHeld29YXLnU14XaHLUCAAAASlIAAAAPmQFdyIjwNhcKvysS5Zp8hvsul9FEiOXHnxq-XdRS_IlpthrARzk8AgLCONogoCN5SuDKxpWgPfSsO0UIeog2PfnR4QOCXZdRxs1kgr6H3ammKuAa9Jmwkbt5FyckwO6z4f1A-DCNRg1moPXsVBn-jTpENkCWYR54wl2eLeRZ3Jzq9hq3WAH8alpFT6LFiQuhB2YTvXX0B5IGvhb1q4nYEGEn2CD7e35YmdpJJ6EBt6IaB77mrLKWMtUTCk0PT_yaPxHHD_rprwU8QaYx-ZgDJVymtOzdtGnDuKYzAoYgNhYE5mogzH1ef2bqW7vfJp2ePI9mE1ijnlWcTazIdg7zuENky5XrizeSpcnhznMsZOpLRrTJW9iOZm4pkQKmNUPmt2YecYRX2h6rBivg_YMOu_2TtMp-kBmQi7MYgAO3acHtnxtGRupIR8FOFhXh1jy0Q7Lps5jRjrV6ydGDR3MiUA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
/
Show response
track.adform.net/Serving/Cookie/
|
73 B
495 B
|
875ms
30ms
|
Script
text/javascript |
37.157.6.241
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.4e690207aee080cc0182c4dd8e7e39dc.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
37.157.6.241
, Denmark,
ASN198622
(ADFORM, DK),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains |
|
GET
H2
|
200
|
f9b17833-d68c-4e4d-b319-d6061d45aa9f
Show response
boot.pubstack.io/v1/tag/
|
1 KB
837 B
|
148ms
39ms
|
Script
application/javascript |
108.128.27.24
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
gocp.stroeermediabrands.de/absconf/www.giga.de/
|
22 KB
22 KB
|
1153ms
42ms
|
Fetch
application/json |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
sodar
Show response
pagead2.googlesyndication.com/getconfig/
|
7 KB
5 KB
|
17ms
17ms
|
XHR
application/json |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gda&tv=r20200303&st=env
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200303/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 3359748fa01c9e7f2a97c2cf1acd9b157995e7b8e11569ac083d767ade4e3078
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
cmTagFEED_MANAGER.js
Show response
vidstat.taboola.com/vpaid/units/27_4_4/infra/
|
692 KB
153 KB
|
21ms
20ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
cmOsUnit.css
vidstat.taboola.com/vpaid/units/27_4_4/assets/css/
|
35 KB
7 KB
|
20ms
20ms
|
Stylesheet
text/css |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
254 B
|
6ms
6ms
|
Image
image/gif |
2a03:2880:f12d:83:face:b00c:0:25de
FACEBOOK
|
|
|
GET
H2
|
200
|
sodar2.js
Show response
tpc.googlesyndication.com/sodar/
|
14 KB
5 KB
|
38ms
37ms
|
Script
text/javascript |
2a00:1450:4001:819::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200303/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
t.png
gocp.stroeermediabrands.de/
|
98 B
355 B
|
26ms
26ms
|
Image
image/png |
188.40.16.106
HETZNER-AS
|
|
General
- Full URL
- https://gocp.stroeermediabrands.de/t.png?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&contentPieceId=2857946&publishDate=2016-09-22T12%3A38%3A19%2B02%3A00&_=1583389045722.-378102029
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
188.40.16.106
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.106.16.40.188.clients.your-server.de
- Software
-
/
- Resource Hash
- ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
|
GET
H2
|
200
|
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/
Frame 1ED5
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:819::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
574ms
29ms
|
Script
text/javascript |
2.19.33.59
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/285/5184/s/
|
39 KB
14 KB
|
3124ms
37ms
|
Script
application/javascript |
89.163.159.103
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
0
316 B
|
280ms
64ms
|
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
|
134ms
38ms
|
Script
text/javascript |
54.76.119.33
AMAZON-02
|
|
|
GET
H2
|
200
|
tag.js
Show response
js.agkn.com/prod/v0/
|
3 KB
3 KB
|
23ms
6ms
|
Script
application/javascript |
2600:9000:20eb:c000:15:efbc:e300:93a1
AMAZON-02
|
|
|
GET
H2
|
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
582 B
|
2899ms
24ms
|
Image
image/gif |
35.186.238.175
GOOGLE
|
|
|
GET
H2
|
200
|
PMS.js
Show response
vidstat.taboola.com/PMS/3.0.4/
|
48 KB
16 KB
|
23ms
22ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
Frame 5912
|
0
51 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gpt_2020022701&jk=992126920691706&bg=!09Cl0MhYrvbGLKJiM1kCAAAATlIAAAAdmQFdxQjohDEBNAZnQFzVjoXtB92feb3WRLex98k1jBxGISi9L4eVRrVvJVNlXDgRalhRnKXW6Ch-T2IAcXTrrFTku0XxyyNwlyd73vqqzshZWBbqKywQsqJoBOqgH-vN2PBzfAavQH_72jX9DSDKFHu2Lu9JQAOVLW2KGppQ07gFiMpIWsT-rbJLBFTVu98tg04V4jDddBGrTfzICBpbIiTbOCDqrKpIehojLiZWnFRM2qEMjGIwNqWG4ewd1W-aAJo1FZHuLujBGi3VQB61qMQx5gv5SUHu9ZYM3uZfavcj0hbwgm4NioBlPqpOAImqEfvmd52RIwdTbtyJm99Pa6kTFimkMyEXBRY1w3coy55Pxk1XOaYt-NCjGDYTEKkP5y6j3d_XDTukC9P9XoFf0-WPqHa1gP7up60hTmdwyrHQOW1bgoNiOWnO9K4DoYz-zkF2BA61RqOe3-Lrw-CeMQ
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame B57A
|
42 B
112 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssjuqT8_qRRUe5y-g923X0AB103ReOfsM-HBlKnCuBlAuyIG-br77yCpUagWT2NqyCPVSjsMDvHmMykW0UskZuDoneY1FxTnWx_w7V3fQQ&sig=Cg0ArKJSzHhY7Td0qkdUEAE&adk=1727577002&tt=-1&bs=1585%2C1185&mtos=1070,1070,1070,1070,1070&tos=1070,0,0,0,0&p=125,429,215,1157&gcm=1&lcs=1&mcvt=1070&rs=0&ht=0&tfs=109&tls=1179&mc=1<e=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1583389044515&dlt&rpt=158&isd=0&msd=0&ext&xdi=0&msp=1&ps=1618%2C5252&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-5-11-11-0-0-0&tvt=1176&is=728%2C90&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%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=20200304
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::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
H2
|
200
|
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/
Frame 6391
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:819::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
Frame 6944
|
0
60 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gpt_2020022701&jk=4238642583443104&bg=!tLelt69YmpfM0TvJHrUCAAAARlIAAAAOmQFdi7UDYzKhszmmQ7uwedpJ6EkBYNRZTpxViqw18aZg2OsHy59-gEi6kICeZKkWIfB7yvbOZ3_0PbQuTOzciOcdAquhL9V_phEbPa5OVudytt4Aw-ZTWdCj9ZMjdoSbZph3jqTc2PsllWPRecd-BSYjehFvO0rzV9QNHnGZPn5eQ90YWeWphAiSVu3TE1yWqNhr8pXGlLyQ8ioMw-GmhBAM21CqAgH9I7FaCUEwdTvO1ne_dPyFm9ghwvDKp4GtImy03ydS71eLj_4UTckkk7SZCFf-qmQ_Tht1dXUXf7CLcKunvVtgy74LR_q1SnTSLgFOJRSHvcTY_IGxIq3sFU1Mo5cJBziLfd2zvnjyWHzdDVZOGqsMIAMj5mI13WEy9wL8nntwMmRE7olH4eBXNLX1zqIPVuvkAwg06aFJ-7iDyQ100K37i4iLlgR_kqbzjvrU2bG4YdLyZMy6DMynFQ
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
|
0
60 B
|
15ms
14ms
|
Image
image/gif |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gda_r20200303&jk=4221733706430658&bg=!YmGlYXlYw0oYju2NznECAAAAQlIAAAAPmQFXJ_heyfWcP2IPN-Esq1qBp3Flped-nAfjhof5KHz9kb-lUMoRDA4fm3RZJkZjI4BIlzzgYvzxH9Rq8uMwsOlWyUlR8W-9DNEpL_iN7-FrtDrZYeNmBFRUNp_q4qbsiFm8-L3ThzihhOgZKBCKkrgO6bwrbS02UqPdMh4MVC0Nw5X2lLmUMrxGqdNnbqkClFGmqUAa7J6sqOdq-iDow1TRE7vwGDvibw-QUMIvHevQ7NgMVUZGw6VQ5VDvzrAW18QbQxg4r3zAaFqZOIzq46lfb_DfcjdEu6c130xOanNns_qLXqBEo0vUAJBKj6HwXqXtvtJqau5ZqBHa-Pw_v_DqmYQqrfpHuEJd3D7UtALYqqcnclLWM1YXSuDchqcMOz3-fblT94H8KFgWvd6H7xV2cy5JrrBzjs7f-d3m7ym4syeZP5sS0zbTv3w8QH11Wa94of1KFY8S2g
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 5912
|
42 B
112 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsu1bkuUxs-QIo_VSwt52yiGnHa3dnyOYyFto5C5kgHF8iTbAqeurPIz8zDYZLeqPrjL4-e-z6uWu6WSZbSVLODLebYeWFyXDSmYi9-CujM&sig=Cg0ArKJSzLvDt2ymquwmEAE&adk=2778923653&tt=-1&bs=1585%2C1185&mtos=0,1036,1036,1036,1036&tos=0,1036,0,0,0&p=125,1318,725,1618&gcm=1&lcs=1&mcvt=1036&rs=0&ht=0&tfs=104&tls=1140&mc=0.89<e=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1583389044703&dlt&rpt=94&isd=0&msd=0&ext&xdi=0&msp=1&ps=1618%2C5252&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-3-11-11-0-0-0&tvt=1139&is=300%2C600&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%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=20200304
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::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
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 6944
|
42 B
112 B
|
16ms
15ms
|
Image
image/gif |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstSCxMMNAZSzm6AfhOL1g1d54vVA2L0WTVM2qkloItjQviJTNo_0OcsWXaWCS9bBdH059Jv9bunV5v8t4AAABb2658Ey82KO8PsA_-TY80&sig=Cg0ArKJSzDwNAiO24_ewEAE&adk=1428895410&tt=-1&bs=1585%2C1185&mtos=1016,1016,1016,1016,1016&tos=1016,0,0,0,0&p=282,968,532,1268&gcm=1&lcs=1&mcvt=1016&rs=0&ht=0&tfs=103&tls=1119&mc=1<e=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1583389044903&dlt&rpt=118&isd=0&msd=0&ext&xdi=0&msp=1&ps=1618%2C5252&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-2-11-11-0-0-0&tvt=1118&is=300%2C250&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%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=20200304
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::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
H2
|
200
|
content14_10_18m.js
Show response
vidstat.taboola.com/
|
37 KB
8 KB
|
23ms
23ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
oppsula.js
Show response
vidstat.taboola.com/oppsula/1.3.7/
|
15 KB
5 KB
|
21ms
20ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
OvaMediaPlayer.js
Show response
vidstat.taboola.com/vpaid/vPlayer/player/v11.0.4/
|
545 KB
140 KB
|
33ms
33ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
sync
match.taboola.com/
Frame 2683
|
0
0
|
36ms
35ms
|
Document
text/html |
151.101.114.49
FASTLY
|
|
General
- Full URL
- https://match.taboola.com/sync?dast=V7TMMCFgMUnIS00PDt0AQUnIS00PDt0AUAAAAGBvQHGzncrUik0W7Em2yWo8ViM1zOlsPVcjabDGEjh7sViTTajXiTzXK0WGx2s-FyN5wtZpsphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G77QdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-wXPQ2Hz1_wcB4eZrfY73Pa3Zq_W-cymj5v1d3k1vzdYr_Lc3orjZa32O9z2t2Cy99idrldfjkAAAAAPAAoFfZD_AACAEQAAAAASAAAAABQBFT8WwhcAAAAAGAAFGD9aABQcCisy2W5uCw_l90fAAAPASAAAAMKJAADOE0lABU5BycAAAAAAAAAACz_____MQB6xGcyABlKgz0ADz4AD0QFiUWMAAAAAKTMJgyPJnVCZVEFAECQbgVwBQAQAJd69VYZBgAAQDC2QA-L32922DV-t8sAAAAAAAAAAMz-z_7RhJgMuNOAKL9J1X4BAQDWfgEBANjUDQDgTQAu6AJgdQYx2Yx2k9kBAAAA3P3____rgZRrMHEuJpvBYORyLUce43BmW24cxtVqMpjZRovtvZr7kH1FgVz3jQjL7PcdFJTT02N2GWQsl8mgFsiaJpffID5oGJaTQTC_CVuMVpPJZjmcLReTwXA0HI32J3CjAU7QcDhY7AaL3WIxnCwmo8FysECBGExwQoajzWQ12q12k-VwMhrNNpMNUrRqNRttBsPVbDLb7VbDwXA5GiFFaxazyWQxGy13m8FyMhoMJ8MhwshwNRvtBpu1xOIZuUUT22itsK1MbsloM5r4FpPZbuJyi14f02u1cKxspik-1Oni2NcuDNXp49jXTlwUDCDbi-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-5ZrMHEuJpvBYORyLUce43BmW24cxtVqMpjZRot9ZbiajXaDzVpi8YzcoolttFbYVia3ZLQZTXyLyWw3cblFr4_ptVo4VjbTvrEabjbD5WA02jdWw81muByMRvsOneG7-pyNyptW4dFJzc7G8SUzHRQug8W7Ua2O48_kIC2bjU6dMnEsaox-v9_v9_v9fr_fb9B6DmaDwnctS5V_w-7m3GZfB6MilghOF-lE9DKeLmKJ5GmRTlQW02rmW1l8E4vF4jKOFiaTc7kbTQaTzcy1Wi4sYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HBpzMFYPJXLGcKzajVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HmQM!&excid=22&docw=0&cijs=1
- Requested by
- Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/27_4_4/infra/cmTagFEED_MANAGER.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
53 B
|
59ms
28ms
|
Image
text/plain |
151.101.114.49
FASTLY
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=45&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7TMMCFgMUnIS00PDt0AQUnIS00PDt0AUAAAAGBvQHGzncrUik0W7Em2yWo8ViM1zOlsPVcjabDGEjh7sViTTajXiTzXK0WGx2s-FyN5wtZpsphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G77QdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-wXPQ2Hz1_wcB4eZrfY73Pa3Zq_W-cymj5v1d3k1vzdYr_Lc3orjZa32O9z2t2Cy99idrldfjkAAAAAPAAoFfZD_AACAEQAAAAASAAAAABQBFT8WwhcAAAAAGAAFGD9aABQcCisy2W5uCw_l90fAAAPASAAAAMKJAADOE0lABU5BycAAAAAAAAAACz_____MQB6xGcyABlKgz0ADz4AD0QFiUWMAAAAAKTMJgyPJnVCZVEFAECQbgVwBQAQAJd69VYZBgAAQDC2QA-L32922DV-t8sAAAAAAAAAAMz-z_7RhJgMuNOAKL9J1X4BAQDWfgEBANjUDQDgTQAu6AJgdQYx2Yx2k9kBAAAA3P3____rgZRrMHEuJpvBYORyLUce43BmW24cxtVqMpjZRovtvZr7kH1FgVz3jQjL7PcdFJTT02N2GWQsl8mgFsiaJpffID5oGJaTQTC_CVuMVpPJZjmcLReTwXA0HI32J3CjAU7QcDhY7AaL3WIxnCwmo8FysECBGExwQoajzWQ12q12k-VwMhrNNpMNUrRqNRttBsPVbDLb7VbDwXA5GiFFaxazyWQxGy13m8FyMhoMJ8MhwshwNRvtBpu1xOIZuUUT22itsK1MbsloM5r4FpPZbuJyi14f02u1cKxspik-1Oni2NcuDNXp49jXTlwUDCDbi-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-5ZrMHEuJpvBYORyLUce43BmW24cxtVqMpjZRot9ZbiajXaDzVpi8YzcoolttFbYVia3ZLQZTXyLyWw3cblFr4_ptVo4VjbTvrEabjbD5WA02jdWw81muByMRvsOneG7-pyNyptW4dFJzc7G8SUzHRQug8W7Ua2O48_kIC2bjU6dMnEsaox-v9_v9_v9fr_fb9B6DmaDwnctS5V_w-7m3GZfB6MilghOF-lE9DKeLmKJ5GmRTlQW02rmW1l8E4vF4jKOFiaTc7kbTQaTzcy1Wi4sYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HBpzMFYPJXLGcKzajVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HmQM!&cmcv=&pix=31589837&cb=1583389046287&uv=2744&tms=1583389046287&abt=affp_vB!expl_vB!ftp1_vB!nopps_vB!t45!ufm_vA!utb11_vB!utc12_vD&ft=0&unm=FEED_MANAGER&debug=pn:!sqg:!torgn:1583389043198.738!ts:1583389046287&
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
BLOB
|
206
Partial Content
|
d876130f-3b10-4e4d-bc09-9bc5afe4421c
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
BLOB
|
206
Partial Content
|
4078447b-a242-4cc2-83ee-3c8cf8774130
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
H2
|
200
|
5302344717
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
205 B
|
70ms
70ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
monitoring.js
Show response
acdn.prod.pubstack.io/
|
61 KB
19 KB
|
107ms
9ms
|
XHR
application/javascript |
2620:1ec:bdf::10
MICROSOFT-CORP-MS...
|
|
|
GET
H2
|
200
|
map
ih.adscale.de/
Frame 9944
Redirect Chain
-
https://ih.adscale.de/map?ssl=1&format=video
-
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=03d0ed3eec424d81bd16e3fafbaa79a9
|
0
0
|
25ms
22ms
|
Document
text/html |
18.185.150.7
AMAZON-02
|
|
|
OPTIONS
H2
|
204
|
error
Show response
intake.prod.pubstack.io/v1/intake/
|
0
178 B
|
115ms
39ms
|
XHR
text/plain |
108.128.27.24
AMAZON-02
|
|
|
OPTIONS
H2
|
204
|
auction
Show response
intake.prod.pubstack.io/v1/intake/
|
0
178 B
|
115ms
39ms
|
XHR
text/plain |
108.128.27.24
AMAZON-02
|
|
|
POST
H2
|
204
|
error
Show response
intake.prod.pubstack.io/v1/intake/
|
0
57 B
|
37ms
37ms
|
XHR
text/plain |
108.128.27.24
AMAZON-02
|
|
|
POST
H2
|
204
|
auction
Show response
intake.prod.pubstack.io/v1/intake/
|
0
57 B
|
38ms
38ms
|
XHR
text/plain |
108.128.27.24
AMAZON-02
|
|
|
GET
H2
|
200
|
5303510597
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
205 B
|
21ms
20ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.2.25/
|
5 KB
2 KB
|
22ms
6ms
|
Script
application/javascript |
2600:9000:2156:4200:1c:8c89:a300:93a1
AMAZON-02
|
|
|
GET
H2
|
200
|
/
d.agkn.com/iframe/8613/
Frame 36D0
|
0
0
|
24ms
9ms
|
Document
text/html |
2600:9000:2156:8a00:19:fc2c:a140:93a1
AMAZON-02
|
|
General
- Full URL
- https://d.agkn.com/iframe/8613/?che=756780735&gdpr=&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22gdpr%22%3A%22%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
- Requested by
- Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2600:9000:2156:8a00:19:fc2c:a140:93a1
, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
|
GET
H2
|
200
|
data
Show response
ups.xplosion.de/
|
3 KB
2 KB
|
41ms
40ms
|
Script
text/javascript |
54.76.119.33
AMAZON-02
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%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=886c72288fc395da52cf164886d37815&event_id=page_view&_sid=69511&_ver=0.2.25&_seg=jsonp&_=737731189906
- Requested by
- Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.25/p.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
54.76.119.33
Dublin, Ireland,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- ec2-54-76-119-33.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
- 00e55928cc2411c7cd9b0bf3995a8d03c14b72d554e2243ea9cd2a2123c03fb4
|
GET
H/1.1
|
200
OK
|
data
lb46.s400.meetrics.net/
|
43 B
308 B
|
26ms
25ms
|
Image
image/gif |
136.243.3.132
HETZNER-AS
|
|
General
- Full URL
- https://lb46.s400.meetrics.net/data?/K06kIJOBALl1FDLkqFKtkyB23A52AwwA6wEylF0pFtlF2qoFx1A4zAz4A5wA0zAx5A4qEt1B6zFu3Bi0F4BFUkzFFCPWKAAAAAAABAjuAPBAAFAAAjuTTfPAPAAAJPAaEABTfPAZAAAOA55A55A85B55A58E55A55AGAx5Aw2A12ArTfPAPCCAAZAwSAcAAAAP0BAJPAaEAHTfPAPAAAsEA6DAMTfPASksFeFjAAAAAAAAAAAAEAAAAjuAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFFAz0A4zBxBEMAxzA4zAwzA0xA23A3xAGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA1zAwzA1xAw1A53AJAylFj0FhuFnsFlBFKA1zAwzA1xAw1A53AKA1zAwzA1xAw1A53AzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAaEAiAAfAAFAAATfPAAAAAPA4tB1uFruFv3FutBz0A4zBxBEAAAAAAAAAAAAAAAAQtjF+wlATA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.132
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h224.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
849 B
|
3190ms
38ms
|
Script
application/javascript |
54.154.128.203
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame 2523
|
0
0
|
3462ms
42ms
|
Document
text/html |
34.252.24.237
AMAZON-02
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
1092ms
27ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
|