GET
H2
|
200
|
Primary Request
/
Show response
www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
|
136 KB
54 KB
|
160ms
104ms
|
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
|
32ms
31ms
|
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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
|
35ms
35ms
|
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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
|
40ms
39ms
|
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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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.486310280f148d9827ab2af608ead7d9.js
Show response
js.stroeermediabrands.de/
|
280 KB
63 KB
|
97ms
29ms
|
Script
application/javascript |
46.253.113.178
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
lux.js
Show response
cdn.speedcurve.com/js/
|
19 KB
7 KB
|
84ms
20ms
|
Script
application/javascript |
151.101.114.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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.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
|
41ms
40ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
main-desktop-f4e314060d.css
www.giga.de/static-local/dist/assets/css/
|
548 KB
62 KB
|
44ms
43ms
|
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
|
78ms
26ms
|
Script
application/javascript |
91.215.103.64
INFONLINE-AS
|
|
|
GET
H/1.1
|
200
OK
|
trackcp.js
Show response
gocp.stroeermediabrands.de/
|
28 KB
11 KB
|
126ms
40ms
|
Script
application/javascript |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
martin-maciej-rcm40x40.jpg
static.giga.de/wp-content/uploads/2013/04/
|
1 KB
2 KB
|
82ms
26ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2013/04/martin-maciej-rcm40x40.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
- 505b170e929bca71e7fec8a2bff588459b60e1e9bc99e6f68443d29b3cd73335
- 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/
|
106 KB
38 KB
|
50ms
21ms
|
Script
text/javascript |
2a00:1450:4001:821::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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:821::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- bbac7f4ecd0a368241dadd013f29d57d6754d666988ff371f102af9a7d23a6e1
- 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
174 B
|
10ms
9ms
|
Image
image/gif |
2a00:1450:4001:814::2003
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
-
https://ssl-econa.met.vgwort.de/na/c50e6523a40d4ebda6d075c30346eeff
-
https://ssl-econa.met.vgwort.de/blank.gif
|
43 B
332 B
|
24ms
23ms
|
Image
image/gif |
161.156.66.178
SOFTLAYER
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
248 B
|
9ms
8ms
|
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
|
7ms
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
|
97ms
37ms
|
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
|
176ms
40ms
|
Script
application/javascript |
23.37.42.216
AKAMAI-AS
|
|
|
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.5113789311160217
- 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=000a&i2=000a169e981933c725...
-
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=000a&i2=000a169e981933c725...
|
0
694 B
|
25ms
24ms
|
Script
application/x-javascript |
91.215.100.40
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=000a&i2=000a169e981933c725e58e99f&ep=1608215517&vr=416&id=sxnjyl&i3=000a169e981933c725e58e99f%3A1609582879397%3A1582885279397%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1582885279397&n1=3&dntt=0<=1582885279399&ev=&cs=699ujf&mo=1&sr=71
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
91.215.100.40
, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- de4.ioam.de
- Software
-
nginx /
BLACKBIRD-RCV v1.06.2 0039
- 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
|
32ms
32ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
2006343101
Show response
videos.giga.de/embed/
Frame E10D
|
9 KB
3 KB
|
127ms
38ms
|
Document
text/html |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
giga-c332db69e7.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
37 KB
13 KB
|
28ms
27ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
init
Show response
d.nativendo.de/cds/delivery/
|
1 KB
1 KB
|
89ms
31ms
|
Script
text/javascript |
107.178.241.34
GOOGLE
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/r/
|
35 B
101 B
|
16ms
15ms
|
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=1036556911&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=4GBAAEAB~&jid=710045880&gjid=1226297021&cid=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&_r=1&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-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%20Original&z=1134277559
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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.0
|
200
OK
|
z.js
Show response
go.giga-abs.de/
|
1 KB
1 KB
|
135ms
29ms
|
Script
text/javascript |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/z.js?0.027471513260486358
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
- 31bf8e20e4ce830f5643b0d3af3e0080e797f098196387018d3fd04f046fa04a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
Cookie set
iframe
tracking.m6r.eu/pixel/
Frame BB11
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
|
135ms
34ms
|
Document
text/html |
23.37.42.216
AKAMAI-AS
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
23.37.42.216
, Netherlands,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a23-37-42-216.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
|
69ms
21ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
publishertag.js
Show response
static.criteo.net/js/ld/
|
96 KB
29 KB
|
52ms
22ms
|
Script
text/javascript |
2a02:2638:1::3
ASN-CRITEO-EUROPE
|
|
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
|
43 KB
15 KB
|
339ms
32ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
288 KB
89 KB
|
324ms
27ms
|
Script
application/javascript |
143.204.101.106
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
126 KB
49 KB
|
3134ms
39ms
|
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
|
121ms
101ms
|
XHR
text/plain |
23.37.42.216
AKAMAI-AS
|
|
|
GET
H2
|
200
|
nuggad
Show response
nugmw.userreport.com/rc-ap/3801ce6d-e2fc-4372-aad7-038e2babe3dd/si.nuggad.net/
Redirect Chain
-
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F
-
https://nugmw.userreport.com/rc-ap/3801ce6d-e2fc-4372-aad7-038e2babe3dd/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecial...
|
2 KB
2 KB
|
50ms
21ms
|
Script
text/javascript |
2600:9000:20eb:d000:1f:a1b:34c0:93a1
AMAZON-02
|
|
General
- Full URL
- https://nugmw.userreport.com/rc-ap/3801ce6d-e2fc-4372-aad7-038e2babe3dd/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2600:9000:20eb:d000:1f:a1b:34c0:93a1
, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- f0c687bc20b7991aaddc8cab8f750a074af32037bd3dd0661ab547e17baf0468
|
GET
H2
|
200
|
SDG_CookieLayer.min.js
Show response
cdn.stroeerdigitalgroup.de/metatag/libraries/
|
15 KB
3 KB
|
45ms
11ms
|
Script
application/javascript |
2a02:26f0:eb:181::5f76
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
99 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=1036556911&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEAB~&jid=&gjid=&cid=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-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%20Original&cd21=auto&cm17=1&cd18=4282584&z=1863413148
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
|
3138ms
23ms
|
Image
image/png |
18.194.129.32
AMAZON-02
|
|
|
GET
H2
|
200
|
post-4661cc0bdf.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
7 KB
3 KB
|
29ms
29ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
smb-phone-plan-ef34ebe4f8.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/
|
53 KB
18 KB
|
29ms
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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
H/1.1
|
200
OK
|
dkuim.js
Show response
dkuim.de/api/js/2/
|
465 KB
151 KB
|
3419ms
41ms
|
Script
application/javascript |
178.19.65.130
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
323 B
|
15ms
14ms
|
Script
application/javascript |
2a00:1450:4001:819::2002
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
171 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:819::2002
GOOGLE
|
|
|
GET
H2
|
200
|
show_ads_impl_fy2019.js
Show response
pagead2.googlesyndication.com/pagead/js/r20200224/r20190131/
|
221 KB
83 KB
|
33ms
32ms
|
Script
text/javascript |
2a00:1450:4001:821::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20200224/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:821::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- f8c08be12e015648be6e4b0040898dd78a7b950926792cd750ee70a12930b89c
- 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/r20200224/r20190131/
Frame 2FD3
|
0
0
|
5ms
5ms
|
Document
text/html |
2a00:1450:4001:819::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20200224/r20190131/zrt_lookup.html
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
article-rating-7143c629e5.js
Show response
www.giga.de/static-local/dist/assets/js/components/
|
306 B
534 B
|
27ms
26ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
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:80b::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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::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
|
loader.js
Show response
c.nativendo.de/cdn/asset/js/
|
56 KB
18 KB
|
35ms
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 E10D
|
619 KB
206 KB
|
40ms
40ms
|
Script
application/javascript |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
Frame E10D
|
264 KB
90 KB
|
35ms
14ms
|
Script
text/javascript |
2a00:1450:4001:817::200a
GOOGLE
|
|
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
107 B
492 B
|
265ms
264ms
|
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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&pid=jemWsrALBYkjx&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
|
7396ms
34ms
|
XHR
application/javascript |
143.204.90.242
AMAZON-02
|
|
|
GET
H2
|
200
|
videojs-f50f7a8d.css
videos.giga.de/dist/css/
Frame E10D
|
53 KB
15 KB
|
69ms
69ms
|
Stylesheet
text/css |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
play_button.svg
videos.giga.de/image/
Frame E10D
|
1015 B
1 KB
|
70ms
70ms
|
Image
image/svg+xml |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
loader.js
Show response
cdn.taboola.com/libtrc/stroeer-smb-giga/
|
196 KB
29 KB
|
21ms
20ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 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=1036556911&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=direkt%20bei%20PayPal&_u=6GBAAEAB~&jid=&gjid=&cid=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-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%20Original&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fwebapps%2Fmpp%2Fpaypal-fees&cd41=Content%201&cd45=all&cm75=1&z=1162342663
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
93 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=1036556911&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Zum%20Geb%C3%BChrenrechner&_u=6GBAAEAB~&jid=&gjid=&cid=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-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%20Original&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fib5j&cd41=Content%202&cd45=all&cm75=1&z=2045939978
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
93 B
|
6ms
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=1036556911&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=OlegDoroshin&_u=6GBAAEAB~&jid=&gjid=&cid=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-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%20Original&cd40=http%3A%2F%2Fwww.shutterstock.com%2Fgallery-363469p1.html%3Fcr%3D00%26pl%3Dedit-00&cd41=Content%203&cd45=all&cm75=1&z=384544243
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
93 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=1036556911&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Shutterstock.com&_u=6GBAAEAB~&jid=&gjid=&cid=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-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%20Original&cd40=http%3A%2F%2Fwww.shutterstock.com%2Feditorial%3Fcr%3D00%26pl%3Dedit-00&cd41=Content%204&cd45=all&cm75=1&z=115338561
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
|
12ms
11ms
|
Image
image/gif |
2a02:2638:1::3
ASN-CRITEO-EUROPE
|
|
|
GET
H2
|
200
|
pixel.gif
static.criteo.net/images/
|
43 B
260 B
|
13ms
12ms
|
Image
image/gif |
2a02:2638:1::3
ASN-CRITEO-EUROPE
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
28ms
28ms
|
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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&__id=1582885279643&__it=-60&__ic=727391&__iq=f697e9c47092634dbb44e07a137172f6&__ig=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
|
bootstrap.min.js
Show response
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
|
36 KB
10 KB
|
8ms
7ms
|
Script
text/javascript |
2001:4de0:ac19::1:b:1b
HIGHWINDS3
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 0842
|
0
0
|
422ms
421ms
|
Document
text/html |
2a00:1450:4001:819::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=1582885279&psa=0&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&flash=0&wgl=1&adsid=NT&dt=1582885279576&bpp=15&bdt=294&fdt=98&idt=99&shv=r20200224&cbv=r20190131&ptt=9&saldr=aa&abxe=1&correlator=2586042179640&frm=20&pv=2&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&ga_fc=0&iag=0&icsg=13210380126914&dssz=66&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=490&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21064523%2C21065304&oid=3&pvsid=15305690729075&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=J8Jn6JkB7B&p=https%3A//www.giga.de&dtd=133
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200224/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
|
41ms
38ms
|
Script
text/javascript |
2a00:1450:4001:819::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/r20200224/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 261a1dfeeccd3f6747dd6bb49e60579c2582910c2b225d23677772825bf7bc3d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
dmp
Show response
tracking.m6r.eu/sync/
|
97 B
621 B
|
263ms
240ms
|
XHR
application/json |
23.37.42.216
AKAMAI-AS
|
|
|
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
|
28ms
27ms
|
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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
|
ads
googleads.g.doubleclick.net/pagead/
Frame ADD7
|
0
0
|
16ms
16ms
|
Document
text/html |
2a00:1450:4001:819::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1582885279&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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1582885279591&bpp=4&bdt=309&fdt=167&idt=167&shv=r20200224&cbv=r20190131&ptt=9&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=2586042179640&frm=20&pv=1&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&ga_fc=0&iag=0&icsg=52841520507662&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&eid=21064523%2C21065304&oid=3&pvsid=15305690729075&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=171
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200224/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
|
nativendo.css
c.nativendo.de/cdn/asset/css/
|
6 KB
1 KB
|
12ms
12ms
|
Stylesheet
text/css |
2606:4700:20::681a:5fb
CLOUDFLARENET
|
|
|
GET
H2
|
200
|
impl.20200227-25-RELEASE.js
Show response
cdn.taboola.com/libtrc/
|
443 KB
125 KB
|
31ms
31ms
|
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
|
13309ms
26ms
|
Script
application/x-javascript |
23.43.115.95
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
3 KB
2 KB
|
112ms
41ms
|
Script
text/javascript |
23.37.42.216
AKAMAI-AS
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 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=1036556911&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=2006343101%20--%20Das%20solltest%20du%20%C3%BCber%20PayPal%20wissen%5Bvideojs%2F7.6.6%5D%5BUser%20Click2Play%5D&_u=6GBAAEAB~&jid=&gjid=&cid=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-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%20Original&cd9=20160501&cd11=2006343101&cd12=SELF&cd13=70&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.6&cd44=1&cm1=1&z=759325640
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
|
2f569144df7e0c84ae662ad76a_ciA2NTADZGMyNjRmMDQ2YTY=.png
files.giga-video.de/da/5c/dc/
Frame E10D
|
15 KB
15 KB
|
345ms
40ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://files.giga-video.de/da/5c/dc/2f569144df7e0c84ae662ad76a_ciA2NTADZGMyNjRmMDQ2YTY=.png
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
- 69f049c8296fa63b9a344f13a405b4f6e58432556da4b3e202af9788dae100ea
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
BLOB
|
200
OK
|
68dd477d-2fba-43a8-bd81-5aa836eefe71
https://videos.giga.de/
Frame E10D
|
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 E10D
|
53 B
703 B
|
99ms
27ms
|
XHR
application/json |
52.219.73.48
AMAZON-02
|
|
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame E10D
|
265 B
436 B
|
26ms
26ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame E10D
|
754 B
1 KB
|
120ms
23ms
|
XHR
application/json |
13.225.73.19
AMAZON-02
|
|
|
GET
H2
|
200
|
json
Show response
trc.taboola.com/stroeer-smb-giga/trc/3/
|
17 KB
7 KB
|
277ms
276ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=11%3A21%3A19.953<i=deflated&data=%7B%22id%22%3A698%2C%22ii%22%3A%22%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%22%2C%22it%22%3A%22text%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1582885279614%2C%22cv%22%3A%2220200227-25-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%2C%22cmps%22%3A3%2C%22btv%22%3A%220%22%2C%22cos%22%3A%224g%22%2C%22bad%22%3A-1%2C%22sw%22%3A1600%2C%22sh%22%3A1200%2C%22bw%22%3A1600%2C%22sde%22%3A%221.000%22%2C%22bh%22%3A1200%2C%22dw%22%3A1585%2C%22dh%22%3A3566%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%3A2795.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.20200227-25-RELEASE.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 3a5e0f7683e69b0fec5c66efac66df080115ffc02129412ee050b06b4ee78ced
|
GET
H/1.1
|
200
OK
|
Cookie set
iu3
aax-eu.amazon-adsystem.com/s/
Frame 4D51
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
|
209ms
209ms
|
Document
text/html |
52.95.123.41
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.95.123.41
Dublin, Ireland,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
Server /
- Resource Hash
|
GET
H2
|
200
|
pubads_impl_2020022401.js
Show response
securepubads.g.doubleclick.net/gpt/
|
167 KB
61 KB
|
32ms
32ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
POST
H2
|
204
|
session
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
1321ms
21ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
POST
|
|
bid
orbidder.otto.de/
|
0
0
|
|
|
|
|
|
POST
|
|
bid
orbidder.otto.de/
|
0
0
|
|
|
|
|
|
POST
|
|
translator
hbopenbid.pubmatic.com/
|
0
0
|
|
|
|
|
|
POST
|
|
v1
prg.smartadserver.com/prebid/
|
0
0
|
|
|
|
|
|
GET
|
|
/
adx.adform.net/adx/
|
0
0
|
|
|
|
|
|
GET
|
|
arj
yieldlove-d.openx.net/w/1.0/
|
0
0
|
|
|
|
|
|
GET
H/1.1
|
200
OK
|
9767196,9767198,9767205
Show response
ad.yieldlab.net/yp/
|
2 B
759 B
|
73ms
30ms
|
XHR
application/json |
2.16.122.151
AKAMAI-ASN1
|
|
|
OPTIONS
H2
|
204
|
v1
Show response
dmx.districtm.io/b/
|
0
460 B
|
365ms
39ms
|
XHR
text/plain |
104.16.190.66
CLOUDFLARENET
|
|
|
POST
H2
|
204
|
bid
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
1307ms
21ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
POST
H2
|
204
|
auction
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
1317ms
33ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
GET
H2
|
200
|
/
Show response
d.nativendo.de/cds/delivery/get/
|
2 KB
1 KB
|
56ms
55ms
|
Script
text/javascript |
107.178.241.34
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=480b4494fe340ce3569442613ff79465&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D480b4494fe340ce3569442613ff79465%2...
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=480b4494fe340ce3569442613ff79465&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D480b4494fe340ce3569442613ff79465%2...
-
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=480b4494fe340ce3569442613ff79465&userId=adscale-user:2f15890f9c2343c8b81f527aed808cfa
-
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=480b4494fe340ce3569442613ff79465&userId=adscale-user%3A2f15890f9c2343c8b81f527aed808cfa&checkcookies=true
|
44 B
574 B
|
71ms
34ms
|
Image
image/gif |
23.37.42.216
AKAMAI-AS
|
|
|
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=480b4494fe340ce3569442613ff79465
|
43 B
876 B
|
852ms
24ms
|
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=SAtElP40DONWlEJhP_eUZQ
-
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
-
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889%2C0&checkcookies=true
|
44 B
569 B
|
38ms
37ms
|
Image
image/gif |
23.37.42.216
AKAMAI-AS
|
|
|
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=480b4494fe340ce3569442613ff79465
|
0
360 B
|
59ms
36ms
|
Image
text/plain |
2.16.122.151
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
Frame E10D
|
201 KB
59 KB
|
21ms
21ms
|
XHR
application/javascript |
13.225.73.19
AMAZON-02
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
3 KB
2 KB
|
66ms
65ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=15305690729075&correlator=3709812591773013&output=ldjh&impl=fif&adsid=NT&eid=21064523%2C21065304&vrg=2020022401&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200228&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%26pc%3D1%26af%3Dtickerad&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D19%26smb-hour%3D11%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%3D480b4494fe340ce3569442613ff79465%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1582885280&dt=1582885280046&dlt=1582885279282&idt=745&frm=20&biw=1585&bih=1200&oid=3&adxs=-12245933&adys=-12245933&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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=74&icsg=3381857312490400&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1585x0&msz=1x1&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- b6179840b256eabf14abf1359e73f1272a73440f0c64101f0afee0c7deb4e0d9
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020022401.js
Show response
securepubads.g.doubleclick.net/gpt/
|
66 KB
24 KB
|
31ms
31ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
|
0
0
|
26ms
6ms
|
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_2020022401.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/
|
7 KB
4 KB
|
464ms
464ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=15305690729075&correlator=3709812591773013&output=ldjh&impl=fif&adsid=NT&eid=21064523%2C21065304&vrg=2020022401&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200228&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%7C1000x150%7C31x31&prev_scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%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%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cfullb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2Cvto&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D19%26smb-hour%3D11%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%3D480b4494fe340ce3569442613ff79465%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582885280&dt=1582885280065&dlt=1582885279282&idt=745&frm=20&biw=1585&bih=1200&oid=3&adxs=-12245933&adys=-12245933&adks=2257154448&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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=75&icsg=3381857312490400&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 2b97730bb566e975de12ff9ddff705b05dedd494cf4f70c7853f6bfd403703b4
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
7 KB
4 KB
|
718ms
718ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=15305690729075&correlator=3709812591773013&output=ldjh&impl=fif&adsid=NT&eid=21064523%2C21065304&vrg=2020022401&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200228&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_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%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&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%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D19%26smb-hour%3D11%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%3D480b4494fe340ce3569442613ff79465%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582885280&dt=1582885280070&dlt=1582885279282&idt=745&frm=20&biw=1585&bih=1200&oid=3&adxs=-12245933&adys=-12245933&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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=75&icsg=3381857312490400&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 95fb08748cffae2fd954e5c468c2dd22415a054a5756e2501c8a9cbb9ce2adfd
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
7 KB
4 KB
|
925ms
925ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=15305690729075&correlator=3709812591773013&output=ldjh&impl=fif&adsid=NT&eid=21064523%2C21065304&vrg=2020022401&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200228&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_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%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%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%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D19%26smb-hour%3D11%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%3D480b4494fe340ce3569442613ff79465%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582885280&dt=1582885280075&dlt=1582885279282&idt=745&frm=20&biw=1585&bih=1200&oid=3&adxs=-12245933&adys=-12245933&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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=75&icsg=3381857312490400&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- b5d8661777bb2e8b16d2c80755be1ebcc9b8bbc7fda8232d7267e89b97714724
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame E10D
|
201 KB
0
|
|
Script
text/javascript |
|
|
|
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
|
86ms
20ms
|
Script
text/javascript |
151.101.113.194
FASTLY
|
|
|
GET
H2
|
200
|
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/
Frame A2AA
Redirect Chain
-
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvkK8Z6PkPq0dsINAi9TudqX4kKH79rCuQlOS33fjEHRCWj9JjurqlffMI0tB-gPT26XRt6VNhOMSVWMY-rZUmfhOzDKRzqmmqPjkZ1MTdZ5d07B0HOpVtF7kXK1KcTQG_yYvEK1Qm-5...
-
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
|
49 B
344 B
|
10ms
8ms
|
Image
image/gif |
2a02:26f0:eb:181::5f76
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/202002261447/
|
31 KB
12 KB
|
21ms
21ms
|
Script
application/javascript |
151.101.113.194
FASTLY
|
|
General
- Full URL
- https://confiant-integrations.global.ssl.fastly.net/prebid/202002261447/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.113.194
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 5d900e780c1bfffd1d07df8acbd5f2feaf75be4e405a53ec670720340bf2a5c6
|
GET
H2
|
200
|
tb
Show response
15.taboola.com/
|
32 KB
32 KB
|
334ms
38ms
|
Script
text/html |
151.101.114.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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&encoded=1&uid=4ecff77f-e3c1-49ca-b576-3f6dc4606d8c-tuct5526f1f&variant=0|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1582885280241&tagid=&cntry=BE&platform=1&sesid=7c3e6bcec92a9bd49dccba2c45e6e819&itemid=/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln&viewid=1582885279614&geolat=&geoing=&deviceifa=&appid=&sd=v2_7c3e6bcec92a9bd49dccba2c45e6e819_4ecff77f-e3c1-49ca-b576-3f6dc4606d8c-tuct5526f1f_1582885279_1582885279_CNawjgYQrMVBGP6uwtqILiABKAEwFjjqxgdA6YYQSNHewgFQ____________AVgAYAA&ri=83a515ca88a1b7bd645e5191027c17a2&appname=&cdb=&gdprApplies=&rid=&sii=-87077898386902071&oee=true&tpubid=1073836
- Requested by
- Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20200227-25-RELEASE.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
- 85a7c7218d6f1e88384824a99e164b8d8fe7da5c4e0e8f1b340d4225e6bc2feb
|
GET
H2
|
200
|
feed-card-placeholder.20200227-25-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
5 KB
2 KB
|
40ms
39ms
|
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
|
38ms
38ms
|
Image
image/svg+xml |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
userx.20200227-25-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
22 KB
8 KB
|
21ms
20ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
204
|
rtb-h
trc.taboola.com/sg/exposebox-network/1/
Frame 7D42
Redirect Chain
-
https://server.exposebox.com/rcm
-
https://trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_iro3u47
|
0
53 B
|
28ms
28ms
|
Image
text/plain |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
match
match.zorosrv.com/
Frame 7D42
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=5ee839d3-b0c1-47a4-8453-9b3198c2810e
-
https://match.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=5ee839d3-b0c1-47a4-8453-9b3198c2810e&tbid=2a9b8f16-10bb-4096-becd-7fe54b3aaca6-tuct5526f21&query=taboola_hm%3D5ee839d3-b0c1-...
-
https://match.zorosrv.com/match?tabid=2a9b8f16-10bb-4096-becd-7fe54b3aaca6-tuct5526f21&extuid=5ee839d3-b0c1-47a4-8453-9b3198c2810e&excid=218&query=taboola_hm%3D5ee839d3-b0c1-47a4-8453-9b3198c2810e
|
0
292 B
|
32ms
31ms
|
Image
text/plain |
151.101.14.49
FASTLY
|
|
General
- Full URL
- https://match.zorosrv.com/match?tabid=2a9b8f16-10bb-4096-becd-7fe54b3aaca6-tuct5526f21&extuid=5ee839d3-b0c1-47a4-8453-9b3198c2810e&excid=218&query=taboola_hm%3D5ee839d3-b0c1-47a4-8453-9b3198c2810e
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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 7D42
|
0
239 B
|
132ms
38ms
|
Image
image/gif |
69.173.144.138
RUBICONPROJECT
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/
Frame 7D42
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=y08IMszXn8vpzkjb0bcKBXRYJZBnrmb2IvRTOrgXRUU%3D
|
45 B
269 B
|
30ms
30ms
|
Image
image/gif |
151.101.114.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=y08IMszXn8vpzkjb0bcKBXRYJZBnrmb2IvRTOrgXRUU%3D
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.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 7D42
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=2d475e58-e9a1-4600-bb01-ec52c52646b1
-
https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=2d475e58-e9a1-4600-bb01-ec52c52646b1
|
0
54 B
|
31ms
30ms
|
Image
text/plain |
151.101.114.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=2d475e58-e9a1-4600-bb01-ec52c52646b1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
204
|
/
trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/
Frame 7D42
Redirect Chain
-
https://bh.contextweb.com/bh/rtset?pid=562107&ev=1&rurl=https%3A%2F%2Ftrc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=%%VGUID%%
-
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=Uvcq0ihcWdZh&ev=1&pid=562107
|
0
79 B
|
52ms
52ms
|
Image
text/plain |
151.101.114.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=Uvcq0ihcWdZh&ev=1&pid=562107
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
204
|
/
trc.taboola.com/sg/rtbhouse-network/1/rtb-h/
Frame 7D42
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=yoRvyYLofJy14Cc1PGjj&pi=taboola&tc=1
|
0
54 B
|
28ms
28ms
|
Image
text/plain |
151.101.114.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=yoRvyYLofJy14Cc1PGjj&pi=taboola&tc=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.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 7D42
|
43 B
695 B
|
18ms
18ms
|
Image
image/gif |
185.33.223.209
ASN-APPNEX
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/google-network/1/rtb-h/
Frame 7D42
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=CAESEDG-5oLMCvQqiESRgbM6sUc&google_cver=1
|
0
178 B
|
31ms
31ms
|
Image
text/plain |
151.101.114.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEDG-5oLMCvQqiESRgbM6sUc&google_cver=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.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 7D42
|
43 B
695 B
|
25ms
24ms
|
Image
image/gif |
185.33.223.209
ASN-APPNEX
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/thetradedesk-network/1/rtb-h/
Frame 7D42
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=624c3ec4-6483-4b7f-ab4d-807a7271cd6b
|
0
177 B
|
28ms
28ms
|
Image
text/plain |
151.101.114.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=624c3ec4-6483-4b7f-ab4d-807a7271cd6b
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
trc.taboola.com/sg/storygize-network/1/
Frame 7D42
Redirect Chain
-
https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=4ecff77f-e3c1-49ca-b576-3f6dc4606d8c-tuct5526f1f
-
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
|
0
57 B
|
29ms
29ms
|
Image
text/plain |
151.101.114.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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.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 7D42
|
35 B
380 B
|
432ms
111ms
|
Image
image/gif |
192.132.33.46
BIDTELLECT
|
|
|
GET
H/1.1
|
204
No Content
|
/
cds.taboola.com/
Frame 7D42
|
0
176 B
|
533ms
94ms
|
Image
text/plain |
141.226.224.32
TABOOLA-AS
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/bidswitch-network/1/rtb-h/
Frame 7D42
Redirect Chain
-
https://x.bidswitch.net/sync?ssp=taboola
-
https://x.bidswitch.net/ul_cb/sync?ssp=taboola
-
https://p.rfihub.com/cm?in=1&pub=20513&ssp=taboola
-
https://x.bidswitch.net/sync?dsp_id=119&user_id=1870471594548486892&expires=30&ssp=taboola
-
https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=01311580-9501-48e7-befa-5fcce60ef212
|
0
55 B
|
28ms
28ms
|
Image
text/plain |
151.101.114.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=01311580-9501-48e7-befa-5fcce60ef212
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.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
99 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=1036556911&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&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=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-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%20Original&cm73=1&cm13=1&z=796329693
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
388 B
|
33ms
33ms
|
XHR
image/gif |
151.101.114.2
FASTLY
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
57 B
|
32ms
31ms
|
XHR
image/gif |
151.101.114.2
FASTLY
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
56 B
|
30ms
29ms
|
XHR
image/gif |
151.101.114.2
FASTLY
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
56 B
|
29ms
29ms
|
XHR
image/gif |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
|
254 B
726 B
|
20ms
20ms
|
Image
image/png |
151.101.114.2
FASTLY
|
|
|
POST
|
|
v1
dmx.districtm.io/b/
|
0
0
|
|
|
|
|
|
GET
H2
|
200
|
54632835-a53e-4604-a2dc-4240cfc1f99e
Show response
t.nativendo.de/cds/tracking/event/
|
0
178 B
|
90ms
34ms
|
Script
text/javascript |
107.178.241.34
GOOGLE
|
|
|
GET
H2
|
200
|
54632835-a53e-4604-a2dc-4240cfc1f99e
Show response
t.nativendo.de/cds/tracking/event/
|
0
181 B
|
89ms
34ms
|
Script
text/javascript |
107.178.241.34
GOOGLE
|
|
|
GET
H2
|
200
|
delayed_impression_vu_fy2019.js
Show response
tpc.googlesyndication.com/pagead/js/r20200224/r20110914/elements/html/impression/
Frame FEB0
|
11 KB
5 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:819::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20200224/r20110914/elements/html/impression/delayed_impression_vu_fy2019.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.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
-
cafe /
- Resource Hash
- 10c830a57fdca6052cc30329c51fd036fbee41f9d82ec8b4365553922ea47f9f
- 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 FEB0
|
43 KB
14 KB
|
41ms
41ms
|
Script
text/javascript |
2a00:1450:4001:819::2002
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame FEB0
|
73 KB
28 KB
|
39ms
39ms
|
Script
text/javascript |
2a00:1450:4001:819::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_2020022401.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e76ea1aec186a6f4e42cf26dcdb80f5953a73b3a6d8aa2840fef68746bb8f693
- 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
|
314ms
21ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
pubads_impl_2020022401.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame FEB0
|
167 KB
61 KB
|
34ms
33ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame FEB0
|
113 B
178 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:819::2002
GOOGLE
|
|
|
GET
H2
|
200
|
UnitFeedManagerDesktop.min.js
Show response
vidstat.taboola.com/lite-unit/1.0.7/
|
22 KB
7 KB
|
321ms
23ms
|
Script
application/javascript |
151.101.14.2
FASTLY
|
|
|
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 E10D
|
53 B
703 B
|
28ms
27ms
|
XHR
application/json |
52.219.73.48
AMAZON-02
|
|
General
- Full URL
- https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=7078073696
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFBoZVhhaWtpY2h1eGFUYWg9UGhlWGFpa2ljaHV4YVRhaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnhuKWsueWwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsayl9KX1rLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5aaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmspeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8obC5JYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9rLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5jbyhrKTtiLmJvKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGsuQWIubGVuZ3RoKXt2YXIgYj1rLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmxvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09aztmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxrKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5aaz0hMTt0aGlzLk9iPSJzZXR1cCI7dGhpcy5iZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRm4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxtYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxGbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5FbihiLmRhdGEpfSxFbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5UYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuT2woYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy53bChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxhbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sd2w6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGY9YltxXS5zcGxpdCgiOiIpLApkPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGY9ZC5zcGxpdCgiLSIpLGQ9ZlswXSt0aGlzLmFsKGZbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscT0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtxPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHEmJihmPTEwMC9xKmQqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFRiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZT0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZSs9Zy50b1N0cmluZygxNik7cmV0dXJuIGV9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHEsZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsbD0yNzE3MzM4Nzgsaz0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcT1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO3E9YztuPWg7bT16O3k9bDt0PWs7Zm9yKGc9MDsxOT49ZztnKyspcD1kKHEsNSkrKG4mbXx+biZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9MjA7Mzk+PWc7ZysrKXA9ZChxLDUpKyhuXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTQwOzU5Pj1nO2crKylwPWQocSw1KSsobiZtfG4meXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz02MDs3OT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Yz1jK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cmw9bCt5JjQyOTQ5NjcyOTU7az1rK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShsKSthKGspKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHEsZixjLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxxPWIuY2hhckNvZGVBdCh6KyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8cT4+NixoPXEmNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKHEpJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxobDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHE9ITEsZj0hMSxjPSExLGg9ITEsej0hMSxsPSExLGs9ITE7dHJ5e2E9dGhpcy5obCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZ2M/ITA6ITF9Y2F0Y2godCl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxrPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1xO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1sO2IuaXNCbGluaz1rO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17Tmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sU2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxWazpmdW5jdGlvbigpe3JldHVybiBiLk5pKCl8fApiLlVpKCl8fGIud20oKXx8Yi5TaigpfHxiLnhrKCl8fGIuSGooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuVmsoKX0sVWw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGUpe2EmJihkLnF1ZXJ5S2V5W2FdPQplKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxobTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuT2I9Yn0sTWU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5PYjt0aGlzLnVlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnhuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5NZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1sLlRhKGEsZCkpO2EmJih4PWwuVGEoYixhKSk7ZyYmKHg9bC5UYSh4LGcpKTtxJiYoeD1sLlRhKHgscSkpO2MmJih4PWwuVGEoeCxjKSk7aCYmKHg9bC5UYSh4LGMpKTtmLkxjKHgpfSxHbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmhtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5tYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuR24oYik7aWYoYSlpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWsucmMoKTtrLndhKGIsITApO2I9ay53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtrLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFrfHwhay5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihrLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9ay5yYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7ay53YShnLCEwKTtnPWsud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ay5MYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSx2YzpmdW5jdGlvbihiKXtpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmMoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWsucmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9ay53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtrLkxhKGQpfX0samY6ZnVuY3Rpb24oKXtrJiZrLlM/ay5pc0VuYWJsZWQmJmsuaWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihmWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBjPSExO2Q9ITE7ZD10aGlzLmViKGIsYS5BYSxmLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9CiExfWMudXJsJiZjLmhhc2gmJihjPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuUGsoYyxiKTtyZXR1cm4gY30sZWI6ZnVuY3Rpb24oYixhLGQsZyxmLGMsaCx4KXt2YXIgbD1jfHxrO2M9ITA7eCYmKGM9ITEpO2lmKGwmJmwuUylpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2wud2EoYixjKTtjPWwud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWMuZGF0YVt0XT1kW3RdO3JldHVybiBsLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZCxnLGYsbCxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFRjOmZ1bmN0aW9uKGIsYSxkLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGwgaW4gaClkKz0iJiIrbCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbbF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGs9bmV3IFhNTEh0dHBSZXF1ZXN0O2sub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWsucmVhZHlTdGF0ZXx8MjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1c3x8ZyhrKTtmJiY0PT1rLnJlYWR5U3RhdGUmJjIwMCE9ay5zdGF0dXMmJjIwMSE9ay5zdGF0dXMmJmYoayl9O3RyeXtrLm9wZW4oYSxiLHgpLGsud2l0aENyZWRlbnRpYWxzPWMsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBrfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5UYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYmQpZm9yKHZhciBjIGluIHRoaXMuYmQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5iZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlVtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmJkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsZil7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxXazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxGaTpmdW5jdGlvbigpe2smJmsuUz9mLnRyYWNrKCJzdGF0c19oZF9wbGF5aW5nX3N1bSIsay5FYiwhMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZpKCl9LmJpbmQodGhpcyksNTAwKX0sRWk6ZnVuY3Rpb24oYil7ayYmay5TP2suRWImJmYudmMoWyJzdGF0c19oZF9lcnJvcmNvZGU6IitiLCJzdGF0c19oZF9lcnJvcmNvZGVfc3VtIl0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FaShiKX0uYmluZCh0aGlzKSw1MDApfX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPQpiW2ddO3JldHVybiBkfTthLnluPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTthLmhuPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVwPXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIiwKbmFtZToiYWRNaWRQb2ludCJ9O2Eudmc9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTthLkhrPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTthLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuYXA9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS52cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2EuS2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07YS51bD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2Eud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5JYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9OwphLnJlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTthLnRlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07YS5Jaz17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5sbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudHA9Cntjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlhvPXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGw9Yy5wanx8bDtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYudm09YTthLnByb3RvdHlwZT0Ke319KShjKTt2YXIgamE9Yy52bXx8amE7bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5yaj1hO2EucHJvdG90eXBlPXtUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZyxmO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoZj1iLmxlbmd0aDtkPGY7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxkbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrCiIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLkVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfSx5bTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhKCkrIjIifSx4aDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLlRlKHRoaXMuZG0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fQp2YXIgYj0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87YS5leHRlbmQ9ZnVuY3Rpb24oZSl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZz1PYmplY3QuY3JlYXRlKGQpLGY7Zm9yKGYgaW4gZSlnW2ZdPSJmdW5jdGlvbiI9PT10eXBlb2YgZVtmXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbZl0mJmIudGVzdChlW2ZdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGYsZVtmXSk6ZVtmXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2YuWmk9YX0pKGMpO3ZhciBLPWMuWml8fApLO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxhPWMuRmt8fGxhO25ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5NYT17fTt0aGlzLkc9bnVsbDt0aGlzLlljPTEwMDt0aGlzLlViPTA7dGhpcy5WYT0xNTA7dGhpcy4kYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlViPD10aGlzLlZhPyh0aGlzLlViKyssdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSk6MD50aGlzLlZhJiYodGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSl9LFluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWI+CnRoaXMuVmE/ITA6ITF9LHpmOmZ1bmN0aW9uKCl7dGhpcy5VYj0wfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sZW86ZnVuY3Rpb24oYSl7dGhpcy5HPWF9LGJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sTjpmdW5jdGlvbihhKXt0aGlzLk1hW2Eua2EoKV09YTtMJiZMLkRoJiZMLkFvKGEpfSxmcTpmdW5jdGlvbigpe3JldHVybiBmLlJlKHRoaXMuTWEpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9CnRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLlljPTEwO3RoaXMuVWI9MDt0aGlzLlZhPTUwO3RoaXMuWD1udWxsO3RoaXMuaGE9ITE7dGhpcy5wbGF5ZXI9YTt0aGlzLk5iPSIiO3RoaXMuUWc9ITE7dGhpcy5KKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGdxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0saG86ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSxlcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVWI8PQp0aGlzLlZhJiYodGhpcy5VYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLHRoaXMuWWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuaWQ9YX0seXE6ZnVuY3Rpb24oKXt9LFc6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1hO3RoaXMucW0oKXx8dGhpcy5MaygpO3RoaXMuUWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxocTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApZZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmN1cnJlbnRUaW1lP2EuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk5iPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmJ9LApZaDpmdW5jdGlvbigpe3RoaXMuTmI9bnVsbH0sanE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLk5iJiYoYT0hMCk7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITApfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy52aWRlb1RhZztiJiZiLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkNrPSIzIjt0aGlzLmhkPTA7dGhpcy5ibj0zMDt0aGlzLmRjPVtdO3RoaXMub2I9W107dGhpcy55Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPQohMTt0aGlzLnN0YXR1cz10aGlzLmhkO3RoaXMuaWQ9Zi5WKDEwKTt0aGlzLkZmKGEpO3RoaXMuZm8oYil9LGY6ZnVuY3Rpb24oKXt9LGphOmZ1bmN0aW9uKCl7dGhpcy53aXx8KHRoaXMud2k9ITAsZi5qZigpKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlIoKTtRJiZRLnBjJiYhbWEmJihtYT0hMCxmLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLm1jKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5tYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKSxiPSEwLGU9bmV3IEk7d2luZG93W2UuZ2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0uaW5pdGlhdG9yIT1mLm1jKCkmJih0aGlzLkdmKCksYj0hMSk7cmV0dXJuIGJ9LEM6ZnVuY3Rpb24oYSxiKXt2YXIgZT0hMDthJiYoZT0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy54bSgpO2lmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5kYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5kYyYmMDx0aGlzLmRjLmxlbmd0aCYmCih0aGlzLmRjPWYudW5pcXVlKHRoaXMuZGMpLGYudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLmRjLmpvaW4oIiwiKSkpO2lmKHRoaXMub2Ipe2Zvcih2YXIgZT0wO2U8dGhpcy5vYi5sZW5ndGg7ZSsrKXRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPT10aGlzLnljW2FdJiZiLnB1c2godGhpcy5vYltlXS5kZXRhaWwpLHRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPHRoaXMueWNbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy55Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuQ2t9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZH0sb2c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLmtnfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5oZH0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihmKXtmLmZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPWEuUnA7Yj9iLnBhP2IucGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7dmFyIGE9ITEsZz0iIjtiLmdldEVycm9yJiYoYT1iLmdldEVycm9yKCkpO2F8fGIuZGV0YWlsLmdldEVycm9yJiYoYT1iLmRldGFpbC5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZSYmKGcrPWEuZ2V0RXJyb3JDb2RlKCkpO2EuZ2V0TWVzc2FnZSYmKGcrPWEuZ2V0TWVzc2FnZSgpKTtnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5nanx8cGE7KGZ1bmN0aW9uKGYpe2YuaGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuTGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkxqfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5uaD10aGlzLnhiPSExO3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YS5hdXRob3JpdHkmJmEuYXV0aG9yaXR5LmluZGV4T2YmJjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnRsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuOwphPXRoaXMudmlkZW9UYWcucGFyZW50Tm9kZS5wYXJlbnROb2RlfXRoaXMuVChhKX0sTGU6ZnVuY3Rpb24oKXtpZighdGhpcy54Yil7dmFyIGE9dGhpcy5OaCxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fCh0aGlzLnhiPSEwKTt0aGlzLlcoYil9fSxOYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmCjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe2IuZHVyYXRpb24mJmIucG9zaXRpb24mJjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LGxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTsKYi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5tZiYmKDAsdGhpcy5tZikoKX0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKCFhLmdldFN0YXRlfHwicGxheWluZyIhPWEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiYKYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxsYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGI9ITE7YS5nZXRWb2x1bWUmJmEuZ2V0Vm9sdW1lKCkmJihiPWEuZ2V0Vm9sdW1lKCkpO3JldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQWp8fHNhOyhmdW5jdGlvbihjKXtjLnpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuc2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLkhiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5IYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkhiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5IYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkhiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7Zm9yKHZhciBkPSJhZFBsYXkgYWRDb21wbGV0ZSBhZENsaWNrIGFkSW1wcmVzc2lvbiBhZE1ldGEgYWRTa2lwcGVkIGFkVGltZSIuc3BsaXQoIiAiKSxlPTA7ZTxkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuSGI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLmkoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChldmVudC5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpO2Eub24oInBsYXlsaXN0aXRlbSIsZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS50bD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTmI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/CnRoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnNlJiZ0aGlzLmkoKSl9LFltOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuS2U/dGhpcy5LZSsrOnRoaXMuS2U9MTp0aGlzLkplP3RoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy56anx8dGE7KGZ1bmN0aW9uKGMpe2MuQmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWWwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPQpbXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLnhifHx0aGlzLk0oZSl8fHRoaXMuRW0oZSl8fCh0aGlzLk4oZSksZT1uZXcgdGEoZSx0aGlzLkcpLGUuSigpLGUuZigpKX19dGhpcy5QKCl9fSxicTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxZbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQmp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkNsfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Yuc2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksCmE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFllOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5UYigxMCk7dGhpcy5WZj0hMDt0aGlzLkRjPXRoaXMudWg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmNsKCksdGhpcy56YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuRCgidC1vbmxpbmUuZGUiKT8KITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuSD9hLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYS5IJiZhLkguSWE/YS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkgmJmEuSC5JYT90eXBlb2YgYS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5wZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLAphLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5wYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueWU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9CnRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy50aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLlJuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkRjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkVjPSEwO2lmKGYuRCgiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmCmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5FY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxhcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGNsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0sCnpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkRjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGM/dGhpcy53KCk6KHRoaXMuZGEoITApLAp0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnVoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwKKGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGRsOmZ1bmN0aW9uKCl7dGhpcy5KY3x8KHRoaXMuSmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihhLmFkcyl7aWYodGhpcy5KYyE9YS5hZHMuc3RhdGUmJih0aGlzLkpjPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRsKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYKMTAwOT09dGhpcy5LKXJldHVybiEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl7dmFyIGE9ITE7Zi5UYygiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYil7Yj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVWwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fAoodGhpcy5WZj0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkModGhpcy5WZixmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbmw6ZnVuY3Rpb24oKXt0aGlzLmtxfHwoMTA8dGhpcy5ncD8odGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmdwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sWG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaHApe3RoaXMuaHA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMucmt8fHlhOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2VdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmCihhPWEucGxheWVyLnBsYXllcigpLGIucHVzaChhKSk7aWYoMDxmLlJlKGIpKXtmb3IodmFyIGUgaW4gYiliLmhhc093blByb3BlcnR5KGUpJiYoYT1uZXcgeGEoYltlXSksYS5oYXx8dGhpcy5NKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYSksKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLkFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5Bbnx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3RoaXMuc2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LEJuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTmIsZT10aGlzLmthKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLnBjJiYoMDw9ZS5pbmRleE9mKGQpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmCmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLlVqfHxSOyhmdW5jdGlvbihmKXtmLlRqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8KHRoaXMuUGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5QYisrLDE1PHRoaXMuUGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sCmVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmYihlLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCnRoaXMuSyk7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMuS2w9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5CbihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihmKXtmLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9CjE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPAphLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGU9bmV3IFIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgQ2EoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVmp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm1ufHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkRuPQphLnBvc2l0aW9uaW5nO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUud2lkdGg9YS53aWR0aDtlLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZS5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Uuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuRG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGUpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGIpfXRoaXMuVChlKTt0aGlzLlcoZSk7dGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLkNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DZCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1sOmZ1bmN0aW9uKCl7Zi56aCh0aGlzLkNkKTtmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTsKaWYoZi56aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLk0oYSkpKXt0aGlzLk4oYSk7KG5ldyBJYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Ibj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuSG58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSxNazpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5HaT0hMTt0aGlzLkxoPWQ7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmsmJmsuY2YodGhpcy5GYS51cmwpJiYhYyYmCihjb25zb2xlLmxvZygidGVzdDEiKSxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsInN0YXR1czAiLCEwKSk7ZyYmNCE9aC5yZWFkeVN0YXRlJiZnKGgpfS5iaW5kKHRoaXMpfWMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksayYmay5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTprLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLiRpPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxWbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYiwKYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17QXA6IkFkQ2xpY2tUaHJ1IixDcDoiQWRFcnJvciIsRHA6IkFkU3RvcHBlZCIsR3A6IkFkTGluZWFyQ2hhbmdlIixIcDoiQWRUYWdQYXJzZWQiLEtwOiJBZFZpZGVvQ29tcGxldGUiLE5wOiJBZExvYWRlZCIsT3A6IkFkU2tpcHBlZCIsUHA6IkFkU3RhcnRlZCIsRXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixGcDoiQWRJbXByZXNzaW9uIixCcDoiQWRDcmVhdGl2ZVZpZXciLElwOiJBZFZpZGVvTWlkcG9pbnQiLEpwOiJBZFBhdXNlZCIsTHA6IkFkVmlkZW9TdGFydCIsTXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5sZSxhW2RdKX0sVW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKCl7fSl9aWYodGhpcy5HYSYmdGhpcy5HYS5rZSlmb3IodmFyIGEgaW4gdGhpcy5HYS5rZSl0aGlzLkdhLmtlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuVm4oKTt0aGlzLkdhJiZ0aGlzLlVuKCl9fX0pKGMpO3ZhciBOYT1jLiRpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZmM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5XYj0iIjt0aGlzLmllPQoic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5iYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5YYj0iIjt0aGlzLlliPVtdO3RoaXMuWmI9W107dGhpcy5jZD1bXTt0aGlzLnVjPSIiO3RoaXMuSWI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm9jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMuRWI9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5GYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9CiExO3RoaXMuWmM9dGhpcy5QZD1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmZjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlFjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5XYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLApIT01BRF9BREJMT0NLRVI6dGhpcy5iYyx0ZXN0SGlkZTp0aGlzLlhiLHRlc3RUYWdzOnRoaXMuWWIsdGVzdFRhZ3NKUzp0aGlzLlpiLHRlc3RUYWdzWEhSOnRoaXMuY2QsdGVzdDNQQ29va2llOnRoaXMudWMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm9jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5FYixibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkZjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCwKYWRGYWxsYmFja0NvbmZpZzp0aGlzLmtkLHlpZWxkbGFiOnRoaXMuRGJ9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJgoodGhpcy5UZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUWM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuV2I9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5iYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuWGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYKKHRoaXMuWmI9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYodGhpcy5jZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudWM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm9jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLkViPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnNkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9CmIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLktmPWIuc2tpcEFsbG93ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxwbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09CiEwfSxabDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuV2soYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIiwKZj0iIixjPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuYmYoYik7Zj10aGlzLmFhKGIpO2c/KHRoaXMuU2MoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucmMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5mY3x8dGhpcy5xZCkmJihoPXRoaXMuZG4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5hbShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhkPWQuZXhlYyhiKSkmJihkWzJdfHxkWzVdKT9hPSEwOnRoaXMuU2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhiKSkmJmRbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFNjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYW06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihkIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2RdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuV3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxyYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYKKGE9ZC5mYWxsYmFjayk7cmV0dXJuIGF9LGNuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgbD1oW0JdLnNwbGl0KCI9Iik7Z1tsWzBdXT1sWzFdfWZvcih2YXIgayBpbiBhW2NdLnN1YnZhbHVlcylnW2tdPXRoaXMuSGgoZ1trXSxrLGFbY10uc3VidmFsdWVzW2tdKTtoPVtdO2ZvcihrIGluIGcpaC5wdXNoKGsrIj0iK2dba10pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9az1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWsucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sZG46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmZjJiYoYj10aGlzLmNuKGIsdGhpcy5mYykpO3JldHVybiBifSxsbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5mbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxmbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEua28oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmpvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxmLGMpe2s9dGhpczt0aGlzLmRmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1kO3RoaXMuY2U9Zzt0aGlzLmpjPWY7dGhpcy55YT1jfHx7fTt0aGlzLmxsKCk7dGhpcy5UbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlJtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5IYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkhjKCl9Y2F0Y2gobCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGQpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSx5bDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sVG06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUWMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMubm0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuSGMoKX0uYmluZCh0aGlzKSwhMCl9LFJtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlRiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChlKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmpjPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5qYz0hMSk7dGhpcy5qYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmpjP3RoaXMuamMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuTGMobC55bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbm06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5XYnx8dGhpcy5BYXx8dGhpcy5IYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxIYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5EKCJ3ZWIuZGUiKXx8Zi5EKCJnbXgubmV0Iil8fGYuRCgiZ214LmF0Iil8fGYuRCgiZ214LmNoIil8fGYuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLldiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5WZT1kLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLldiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucmMoKSksZD10aGlzLmFhKHRoaXMuV2IpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuV2IrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZT1hLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7aWYoIXRoaXMub2MmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm9jPSEwO3RoaXMuVWMoITApOwpyZXR1cm59fWU9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihlPSEwKX1jYXRjaChoKXt9aWYoIShlfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihkLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlhiPWQudGVzdGhpZGV8fCIiO3RoaXMuWmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5jZD1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudWM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5mYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZC5qc3BvcHVwc3x8ITE7dGhpcy5BYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkZjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWQueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1kLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm9jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5vYz0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLk9vKCkmJih0aGlzLlhifHx0aGlzLlpifHx0aGlzLllifHx0aGlzLmNkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuR28oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFhtOmZ1bmN0aW9uKGEpe3RoaXMuSGk9ITA7dmFyIGU9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZT10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZSkpLGU9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmUsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihlKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuVGModGhpcy5yYygpLCJQT1NUIixlLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBlPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztlPWUucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGUsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitlKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGUsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy5FYj0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0sRm86ZnVuY3Rpb24oKXtpZih0aGlzLlhiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5iYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuWGIpO2Uuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5YYik7ZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpOwphPWR9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKCkpLHRoaXMuS28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLlhkKHRoaXMuYmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5ZYj10aGlzLmNkKSYmdGhpcy5ZYi5sZW5ndGgpe3ZhciBkPXRoaXMuWWIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxLbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2YoKSYmZSgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZCgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5UYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGUuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBlKCl7dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlpiJiZ0aGlzLlpiLmxlbmd0aCl7dmFyIGQ9dGhpcy5aYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LExvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihlLGQpe2Q9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnVjKXRyeXtmLlRjKHRoaXMudWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSWI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixlPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLkViJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5ZaygpO3RoaXMudWMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5JYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLklifSl9LFlrOmZ1bmN0aW9uKCl7dGhpcy5aYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlpjLmlkPWYuVigxMCk7dGhpcy5aYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWmMpO3ZhciBhPXRoaXMuWmMuY29udGVudFdpbmRvdyxlPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5QZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxrbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucG0oKSl7dmFyIGE9dGhpcy5abCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGUsZCxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuR2k9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGdsOmZ1bmN0aW9uKCl7dGhpcy4kbXx8KHRoaXMuJG09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoZz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5TYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChlKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChlKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSxFbzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30saWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuJG8uYmluZCh0aGlzKSx0aGlzLlpvLmJpbmQodGhpcykpfSwkbzpmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbDt0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuSmwoKX0sWm86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5MYyhsLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuQWJbYV07InJlcXVlc3QiPT1lLnR5cGUmJmYuZWIoZS51cmwsZS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1lLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmdhKCldPXRoaXM7Zi5lYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxUYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPQoiIixkPTA7ZDxhO2QrKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZX0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPSIiLGQsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGV9LGFhOmZ1bmN0aW9uKGEpe3ZhciBlPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2VbZ11dPWFbZ118fCIiO2QucXVlcnlLZXk9e307ZFtlWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGUpe2ImJihkLnF1ZXJ5S2V5W2JdPWUpfSk7cmV0dXJuIGR9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9IiIsZSxkO2ZvcihlPTc7MDw9ZTtlLS0pZD1hPj4+NCplJjE1LGIrPWQudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChuJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGYsNSkrKG4mcHx+biZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWQoZiw1KSsobl5wXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1kKGYsNSkrKG4mcHxuJnJ8cCZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZChmLDUpKyhuXnBecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2Esaz1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Daj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuQ2p8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMua2M9dGhpcy5yZD0hMTt0aGlzLlVrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuWGs9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5vZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Taz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlhjPXRoaXMuVGQ9ITE7dGhpcy5GaD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLnBjPSExO3RoaXMudmw9Zi5WKDEwKTt0aGlzLlNiPWYuVigxMCk7dGhpcy5RYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy5hYz10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMueGM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Qbz10aGlzLkdiPXRoaXMuUmI9ITE7dGhpcy5CYz1bXTt0aGlzLnFjPXt9O3RoaXMudm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkdjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGU9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZX0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuT2ImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLndvKCk7Zi5vKGwuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxlLGQsZyl7dGhpcy5HYj0KZDt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5rbCgpLGc9ay5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLmFvKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZSxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZSxkKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy5hYz10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5xbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5CYz10aGlzLmFoKGEpO3RoaXMub2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMuam0oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGU9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZT10aGlzLmFoKGIucGFyZW50KSksZS5wdXNoKHRoaXMuVGwoYikpKTtyZXR1cm4gZX0sVGw6ZnVuY3Rpb24oYSl7dmFyIGU9IiIsZD1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2U9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylkLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDplLGNyZWF0aXZlSUQ6ZH19LGptOmZ1bmN0aW9uKGEpe3ZhciBlPVtdLGQ9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGUubGVuZ3RoO2grKylkLnB1c2goYS51YihlW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZT0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGU9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZT1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTplPT1GLm1lLmNvZGU/Zi5vKGwudXAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGU9PUYuaGcuY29kZSYmZi5vKGwuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGwuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnhvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSWImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5JYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhsLmFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8obC52cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhsLndwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8obC5obix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8obC5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8obC5Zbyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMubGMoYSk7dGhpcy5SYSgpfSxsYzpmdW5jdGlvbihhKXt2YXIgZT05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZT1hLmVycm9yLmNvZGUsOTAxPGUmJihlPTkwMCkpO2ZvcihlPXsiW0VSUk9SQ09ERV0iOmV9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLmdmKGQudXJsLGQudHlwZSxlKX1jYXRjaChnKXt9fSxxbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBlPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGU9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1lO2U9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2QmJmQuZW52dmFycyYmKGc9ZC5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRmQmJihnPWQuRmQoKSk7Zy52aWRlb1Nsb3QmJihlPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31lLnZxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihlLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZS5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZS5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5TayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGUudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZS5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZSxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLndmJiZlLmxvYWQoKTtpZih0aGlzLm1pKGUpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGUpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWU6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpfWNhdGNoKGspe3RoaXMudmlkZW89CmV9fWVsc2UgdGhpcy5iLnJsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxvbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnhjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGwuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlJrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVmIoIm11dGVkIiwiY29udGVudCIpO2YubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRix0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5tbSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGsuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRiwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8obC5JYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5uYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5CYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmpwKCksdGhpcy5hLm5jKCEwKSwhdGhpcy5hYykpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5hYz17ZWw6dGhpcy5GLGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8obC5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubmMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5uYyghMCksdGhpcy5ycCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5wcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm9wKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhsLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5GY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMua3AoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnRjKCkpLHRoaXMubHAoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlZiKCJtdXRlZCIsInVzZXIiKSxmLm8obC5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVmIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGwuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGwudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkYsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxrcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnhjPSEwfSxscDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54Yz0hMX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8obC51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8obC50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHBwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhsLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sb3A6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGU9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7Zi5EZSgpO3RoaXMuRj0hMTt0aGlzLlJhKGEpfX0saXA6ZnVuY3Rpb24oYSl7dmFyIGU9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZSYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZT1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZS5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhsLnRwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApOazpmdW5jdGlvbihhLGUpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuU2MoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZChlLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuZnAuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChlLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmtjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2N8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuVWspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlJiJiYhdGhpcy5rYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUmJ8fCh0aGlzLlJiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGUpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuY3AoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuYnAoKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLnZpZGVvLnBsYXkoKTtpZihlJiZlWyJjYXRjaCJdKWVbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5zYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnNjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8obC5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPVtdLGQ9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWQ9Zi5maChhW2ddKSxlLnB1c2goZCk7YT17aGFzaGVzOmV9O2E9bC5UYShhLHRoaXMudSgpKTtmLnVvKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Layh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhsLmxuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkZifHx0aGlzLmIuemMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmtjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZSl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5wYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRmImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIuemMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSxmcDpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmtjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5nbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5wYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhsLkljLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlNvKGEpO2lmKCF0aGlzLmFjKXt2YXIgZT0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuYWM9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhsLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmUscGVyY2VudDpkLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX1kPSIiO3RoaXMuYi5MZiYmKGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuTGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhsLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkZiPyh0aGlzLmtjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxlLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFNvOmZ1bmN0aW9uKGEpe2YubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5SYnx8KDA9PWEmJih0aGlzLkdiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLkdiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5JYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSWIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5SYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGwudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8obC5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGUpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZSwhMCl9LHdvOmZ1bmN0aW9uKCl7Zi52YyhbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YudmMoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtmLnZjKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi52YyhbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFZiOmZ1bmN0aW9uKGEsZSl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZSwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZSl7aWYoIXRoaXMuUmIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5rbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGM9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkdjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGwuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZSl0cnl7dGhpcy5iLlBhPXRoaXMuemwodGhpcy5iLlBhLGEpfWNhdGNoKGspe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZT0iIjt0aGlzLmNnJiYoZT0iX3ZwYWlkIik7dGhpcy5kZCYmKGU9Il93ZWxlY3QiKTtyZXR1cm4gYStlfSxnZjpmdW5jdGlvbihhLGUsZCxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihlPXRoaXMuQS53YShhKSxkJiZlLk1rKGQpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuT2soYSksdGhpcy5BLkxhKGUsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE9rOmZ1bmN0aW9uKGEpe3RoaXMucWNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5xY1thXT0iY2xvc2VkIn0sb2w6ZnVuY3Rpb24oKXt0aGlzLnFjPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZTtmb3IoZSBpbiB0aGlzLnFjKXRoaXMucWMuaGFzT3duUHJvcGVydHkoZSkmJiJvcGVuIj09dGhpcy5xY1tlXSYmYSsrO3JldHVybiBhfSxrbTpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1lfSl9LHpsOmZ1bmN0aW9uKGEsZSl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1lfSl9LGNwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy50YygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGUpe31mLm8obC5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRmN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZSl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxicDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBlPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGU9dGhpcy5BLnRkKTtlJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLktiLmJpbmQodGhpcyksMUUzKmUpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sS2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMudmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuU2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlFiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Sby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5MYigpO3RoaXMuS2IoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZkLmFwcGVuZENoaWxkKGgpO2QuYXBwZW5kQ2hpbGQoYyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuTGIoKTt0aGlzLktiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUud2lkdGg9IjEwMCUiLGUuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGUuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGUuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLAplLnN0eWxlLmJvdHRvbT0iMHB4IixlLnN0eWxlLnpJbmRleD0iMTAwMDAiLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmUuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGUpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhsLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLkxiKCl9fSxMYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHRjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlNiKTt0aGlzLnhjPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMueGM9ITEpOihmLm1hKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy54Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGwucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwidXNlciIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVmIoIm11dGVkIiwidXNlciIpLGYubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5WYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGwuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5RYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxzYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5zYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEuRWJ8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuT2ImJnRoaXMuVG8oKXx8KHRoaXMueWQ9ITAsdGhpcy5HYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5HYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGU9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixkPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZStkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZT1rLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGN8fChhPQohMCxlLmFkRmFsbGJhY2tVUkx8fChlLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkdjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuR2M/ImFueSI6IiIpKyhlLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5YYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuR2MmJmUuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhjfSwkbDpmdW5jdGlvbigpe3ZhciBhPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxlPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1lLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZS5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmUuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBlPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuJGwoKTt0aGlzLkdjPXRoaXMuWGM9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBlPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2UsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy52bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlpuKCksdGhpcy5wYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhsLnVsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5GYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5CYyYmMDx0aGlzLkJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5CYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5YaysiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5Fa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtlPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy5BYz10aGlzLkNjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGUsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGU9IiI7Yi5xdWVyeUtleSYmKGU9Yi5xdWVyeUtleS5odnApO2UmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmsud2Eoay5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihmLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuRCgiZmFuZG9tLmNvbSIpfHxmLkQoImdpZ2EuZGUiKXx8Zi5EKCJraW5vLmRlIil8fGYuRCgic3BpZWxldGlwcHMuZGUiKXx8Zi5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuRCgiZ2lnYS5kZSIpfHxmLkQoImtpbm8uZGUiKXx8Zi5EKCJzcGllbGV0aXBwcy5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxsKCl8fG0oKXx8ImFwcHNwb3QiPT1lKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChrLldkKGgpKSsiJnR5cGU9anMiLGI9ay53YShrLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9ay53YShrLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9ay5MYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixlKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk9iKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtlW2JdPXt9fWVsc2UgZS5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBlPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5PYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuT2J8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGsuRW8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZDtlLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWUucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZSk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxlPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1lPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkpuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5XYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGUpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuV2MoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFdjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxlLHtBZFN5c3RlbTp0aGlzLlNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlZvKCkmJnRoaXMudGYodGhpcy54bCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5DYz8odGhpcy5DYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuV2MoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLkFjPyh0aGlzLkFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLldjKCkpOnRoaXMucGFyZW50LkloKCl9LFZvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLk5jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRmI9YS5GYj9hLkZiOnRoaXMuQ2M7YS56Yz1hLnpjP2EuemM6dGhpcy5BYzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3RoaXMucGFyZW50LnRmKGEpfSx4bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk5jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuVmwoKTthLkNxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUmwoKTthLkxmPXRoaXMuaW0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZT0hMTsoZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZlLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLldsKCkpOmEuUGEuY29uY2F0KHRoaXMuZW0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5sYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmxjJiZ0aGlzLnBhcmVudC5sYyhhKSxiPTAsdGhpcy5XYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxsYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5sYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGU9bmV3IFRhKGEsYik7ZS5vcmlnaW49dGhpcztyZXR1cm4gZX0sTW86ZnVuY3Rpb24oKXtyZXR1cm4gYjxlfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5OYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxKbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZSl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFNsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGQ9YVtlXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZCYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZSl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspYi5wdXNoKHtpZDphW2VdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZV0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtlXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2VdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZV0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxYcDphW2VdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2VdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxSbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZT0hMSxkPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZT1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2U9Yn1kLnB1c2goZSk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZCxoPWMpOihiPWUsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGltOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGU9ITEsZD0hMTt0cnl7ZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9ZS5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYudG8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5hbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMuemM9dGhpcy5GYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLldqPWE7YS5wcm90b3R5cGU9e3JsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTy5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGNtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGU9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShlPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZS5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2RdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmNtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxtbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk8ubGVuZ3RoO2UrKylpZigwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tlXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuV2p8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMubWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0seHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx5cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLk9tfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWU7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Eanx8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1lO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuZXA9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnpwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy5aaFthXSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ycT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Xbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Qbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzpkLGZyYW1lOmYsd246Yyx2ZW5kb3I6ZS5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMucWYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy5xZltlXTtkLnR5cGU9PT1hJiZkLiRrKHRoaXMuWGwoYSkpfX0sWGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7QXE6ITAsenE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7b3E6InZpZGVvIixEcToianNDdXN0b20iLEVxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRnE6MSxZcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxsbTpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMuYmUubGVuZ3RoO2UrKylpZih0aGlzLmJlW2VdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZV0ud247cmV0dXJuIiJ9LFduOmZ1bmN0aW9uKGEsZSl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5sbShlKSx2ZW5kb3I6ZX0pO3RoaXMudm8oKX0sUG46ZnVuY3Rpb24oYSxlKXsidmlkZW8iPT09YT90aGlzLmVwLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZSl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxlKX0semc6ZnVuY3Rpb24oYSxlKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKJGs6ZSx4cTohMX0pfSx2bzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLnFxKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkJxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLnNtfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuY29uZj1lfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5nYz1bXX1jLmFqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBlPXt9LGQ9ITEsYz0wLGU9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixjPWUubGVmdCxlPWUudG9wKTtmPXt4OmMseTplfTtmLnBvc2l0aW9uPWQ7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBlPTAsZD0wLGM9ITEsZj10aGlzLnVtKGEpLGg9e307YTspZSs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGUrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZSx5OmR9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSxDbzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8obC5JYyx0aGlzLmMubCgpKX0sWm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8obC53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy4kYyYmdGhpcy5jLiRjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxlJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxObDpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmdldFBvc2l0aW9uKGEpO2UucG9zaXRpb24/ZS5wb3NpdGlvbj1lLnBvc2l0aW9uOmUucG9zaXRpb249ImFic29sdXRlIjtlLndpZHRoPWEub2Zmc2V0V2lkdGg7ZS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGV9LG5jOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuTmwodGhpcy50Yik7aWYoZS54IT10aGlzLkhhLnh8fGUueSE9dGhpcy5IYS55fHxlLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxlLndpZHRoIT10aGlzLkhhLndpZHRofHxlLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZS53aWR0aCYmMD09ZS5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1lO3RoaXMuYy4kYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmUueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZS55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1lLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdGhpcy5nY1thXSh7d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5nYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5hanx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMudW58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1lKWEuY29udGFpbmVySWQ9ZS5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Qaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmVjPXRoaXMuZWN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTmI7YSYmYS5wYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZWMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZT0wO2U8Yi5tb2R1bGVzLmxlbmd0aDtlKyspe3ZhciBkPWIubW9kdWxlc1tlXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuVnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5tcSgpOiExfSxOYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTmMoKTotMX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5lYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmVjfHwzMDI9PXRoaXMuZWM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZWMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5mbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Qanx8Y2I7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy4kai5Eay5Caz93aW5kb3cuT08uJGouRGsuQmsuVHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IGNiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlJqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMucW58fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlNpfHxnYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZT1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxlPWEuZGF0YS5tZXNzYWdlKTtmLkQoIndlbHQuZGUiKSYmIXRoaXMuc24mJih0aGlzLnNuPSEwLGYuRWkoYikpOzEyMDUhPWImJig5MDA9PWImJjA8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRWcoYS5hZEVycm9yRXZlbnRzKTsKYS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe2YuRCgid2VsdC5kZSIpJiYhdGhpcy5ybiYmKHRoaXMucm49ITAsZi5GaSgpKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaGI9Yy5SaXx8aGI7KGZ1bmN0aW9uKGMpe2MuVGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxVaDpmdW5jdGlvbihhKXthPW5ldyBnYihhKTthLmhhP3RoaXMuUCgpOnRoaXMuTShhKXx8KGEuUWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLk4oYSksKG5ldyBoYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1sfHwodGhpcy5NbD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuVWgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlVoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgaWI9Yy5UaXx8aWIsVD1uZXcgaWIodCk7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgamI9Yy5RbHx8amI7bmV3IGpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmtrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYSl7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGEpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ra3x8VTsoZnVuY3Rpb24oYyl7Yy5qaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3Lm5kKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLnBuKGEpfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpOwp3Lm5kKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5vbSgpfSxwbjpmdW5jdGlvbihhKXt2YXIgYj0iIixlO2ZvcihlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSl7Yj1pc05hTihhW2VdKT8hMTphW2VdO2lmKDEwMDk9PWFbZV18fDEwMDE9PWFbZV18fDMwMz09YVtlXXx8NDAzPT1hW2VdKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2VdKWlmKGFbZV0uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbZV1bZF0pPyExOmFbZV1bZF0sMTAwOT09YVtlXVtkXXx8MTAwMT09YVtlXVtkXXx8MzAzPT1hW2VdW2RdfHw0MDM9PWFbZV1bZF0pKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufX10aGlzLm0oImFkZXJyb3IiLGIpO3RoaXMuQygpfX0pfSkoYyk7dmFyIFY9Yy5qa3x8VjsoZnVuY3Rpb24oYyl7Yy5saz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO3RoaXMuTGQmJihhPWYuQWwoYSx0aGlzLkxkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTShkKSl7dGhpcy5OKGQpO3ZhciBjPW5ldyBWKGQsdGhpcy5HKTtjLmYoKX19Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IoZT1hW2JdO2UucGFyZW50RWxlbWVudDspe3ZhciBlPWUucGFyZW50RWxlbWVudCxoPWUuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5MZHx8Cih0aGlzLkxkPVtdKSx0aGlzLkxkLnB1c2goYVtiXSksZD1uZXcgVShoKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksYz1uZXcgVihkLHRoaXMuRyksYy5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxuZDpmdW5jdGlvbihhLGIsZSl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYV18fCh0aGlzLmNhW2FdPXt9KTt0aGlzLmNhW2FdW2JdfHwodGhpcy5jYVthXVtiXT1bXSk7dGhpcy5jYVthXVtiXS5wdXNoKGUpfSxObzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVtiXSl0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGEpLHRoaXMuWW4oKSYmKHRoaXMuemYoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgZT0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihlPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtiXVtlXSYmMDx0aGlzLmNhW2JdW2VdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2JdW2VdLmxlbmd0aDtkKyspdGhpcy5jYVtiXVtlXVtkXShhKX19LG9tOmZ1bmN0aW9uKCl7aWYodGhpcy5WYylmb3IodmFyIGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5WY1thXSxlPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbZV1bZF0mJjA8dGhpcy5jYVtlXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmNhW2VdW2RdLmxlbmd0aDtjKyspdGhpcy5jYVtlXVtkXVtjXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1hLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9YS5vRXZlbnRUeXBlLmgmJncuTm8oYSl9fSl9KShjKTt2YXIga2I9Yy5sa3x8a2Isdz1uZXcga2IodCk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5FbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBsYXkoKX0pfSwKdWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLk9pfHxtYjsoZnVuY3Rpb24oYyl7Yy5QaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIithKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5QaXx8bmI7KGZ1bmN0aW9uKGMpe2MuUWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYSYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT0KYVtiXSxkPSIiO3RyeXtkPWUuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGMpe2Q9ZS5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgbWIoZCk7dGhpcy5NKGYpfHwodGhpcy5OKGYpLChuZXcgbmIoZix0aGlzLkcpKS5mKCkpfWNhdGNoKGgpe319dGhpcy5QKCl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGUgaW4gdGhpcy5NYSlpZihiPT10aGlzLk1hW2VdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5RaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFiPWMuem58fHFiO25ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy5wbHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSksdGhpcy5wbD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSmcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz1hLnNvdXJjZS5DSE9PU0VSX0FCfHwiIixoPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYywhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9pbnRlcmFjdGlvbiIsCmMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLkpnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuTm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmljfHwodGhpcy5pYz1bXSk7dGhpcy5pYy5wdXNoKGEpfSxxbDpmdW5jdGlvbigpe2lmKHRoaXMuaWMmJnRoaXMuaWMubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5pYy5sZW5ndGg7YSsrKXRyeXt0aGlzLmljW2FdKCl9Y2F0Y2goYil7fX0sRmQ6ZnVuY3Rpb24oKXtpZih0aGlzLktjKXJldHVybiB0aGlzLktjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE5uOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuTmp8fHJiOyhmdW5jdGlvbihjKXtjLk1qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5EaT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMuRGkmJih0aGlzLmkoKSx0aGlzLkRpPSEwLHRoaXMubmEoKSk7Yi5VYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSWV8fCh0aGlzLkllPTEpLHRoaXMuSWUrKywxMDA8dGhpcy5JZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTWp8fHNiOyhmdW5jdGlvbihjKXtjLk9qPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7Zi50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgZT0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspZT0KbmV3IHJiKGFbZF0pLHRoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IHNiKGUsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciB0Yj1jLk9qfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlRrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdmI9Yy52a3x8dmI7KGZ1bmN0aW9uKGMpe2MudWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LExuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMuRGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuTG4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuRGMpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5oYltiXSYmMzAzIT10aGlzLmhiW2JdJiY0MDMhPXRoaXMuaGJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLmphKCk7CmVsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy51a3x8d2I7KGZ1bmN0aW9uKGMpe2Mud2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBlPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuTShlKXx8LTE9PWUuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihlKSwobmV3IHdiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB4Yj1jLndrfHx4Yix5Yj1uZXcgeGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgemI9Yy5HbHx8emI7bmV3IHpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmRrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnVmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5DbigpfS5iaW5kKHRoaXMpLDUwMCl9LENuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnVmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LHlvOmZ1bmN0aW9uKCl7dGhpcy51Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuZGt8fEFiOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5abT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMud2N8fCh0aGlzLndjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLndjfHx0aGlzLndjKyssdGhpcy53Yzw9dGhpcy5abT8odGhpcy53YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkueW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuY2t8fEJiOyhmdW5jdGlvbihjKXtjLmVrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBCYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIENiPWMuZWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkZsfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5iaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE5hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5ia3x8RmI7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVWEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5RbSgpOnRoaXMuR2coKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxzbDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sUW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpiKCk7IWEucGEmJmEuWSYmYS5TcCYmYS5VcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEdnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgZTthOnthPWEuZ2V0RXJyb3IoKTtmb3IoZSBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtlXSl7ZT1hW2VdO2JyZWFrIGF9ZT12b2lkIDB9MTAwOT09ZXx8MzAzPT1lfHw0MDM9PQplPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGUpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5KYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5VYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sbnE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSmIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuYWt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0samw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IEdiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLmpsKGFbYl0pO3RoaXMuUCgpfX0pO2MuZ2QuSmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBkPQpiW2VdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0mJmJbZV0uZmVybW9kJiZhLnB1c2goYltlXS5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy52anx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sJGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVWE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLkpqfHxYOyhmdW5jdGlvbihjKXtjLklqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnZmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMudmY9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGU9YS5wbGF5ZXJDb250YWluZXI7ZSYmdGhpcy52ZiYmZSE9dGhpcy52Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLkQoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLnNxKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSWp8fFk7KGZ1bmN0aW9uKGMpe2MuS2o9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLAplPWIubGVuZ3RoLGQ9MDtkPGU7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLnpmKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBHLEtiPWMuS2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5ZaXx8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubWo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxlPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksZT1hLkdldEVsKCksYiYmZT8odGhpcy5UKGUpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5tanx8TmI7KGZ1bmN0aW9uKGMpe2MubGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxCZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksZT0wO2U8Yi5sZW5ndGg7ZSsrKXRoaXMuaGFuZGxlRXJyb3IoYltlXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLmxqfHxPYjsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgTmIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgT2IoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFBiPWMubmp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmJqfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGU9ITE7YT8oZT1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZlPyh0aGlzLlQoZSksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuVml8fFNiOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy5XaXx8VGI7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGU9bmV3IFNiKGFbYl0pO2UuaGF8fHRoaXMuTShlKXx8KHRoaXMuTihlKSx3aW5kb3cuYnJpZHBsYXllcj1lLChuZXcgVGIoZSx0aGlzLkcpKS5mKCkpfX10aGlzLlAoKX19KX0pKGMpO3ZhciBVYj1jLlhpfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMubm58fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSwkZDpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LE1uOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuemt8fFhiOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmhjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0saGM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkdrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuR2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmhjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuUW4oKX0sUW46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5Lbj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5Lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmhjKGEpKX19KX0pKGMpO3ZhciBZYj1jLnlrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhLk1uKCksYT1uZXcgWWIoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMuQWt8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5kanx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2V8fChlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtlPyh0aGlzLlcoZSksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5lbj1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW59LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlpkKGEpfS5iaW5kKHRoaXMpKX0sWmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5va3x8TjsoZnVuY3Rpb24oYyl7Yy5uaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8Cih0aGlzLlBiPTApLHRoaXMuUGIrKywxNTx0aGlzLlBiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLm1vKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5LPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT0KYS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSYmYVtjXSYmYVtjXS5hZEVycm9yJiZhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMubmt8fE87KGZ1bmN0aW9uKGMpe2MucGs9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuemYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBiYz1jLnBrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5janx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ganx8WjsoZnVuY3Rpb24oYyl7Yy5Faj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuVGIoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy56YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx6YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRWp8fGFhOyhmdW5jdGlvbihjKXtjLkdqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGVjPWMuR2p8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLlBtfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLmpqfHxoYzsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5GZygpfSxGZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMuaWp8fAppYzsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuUCgpO3JldHVybn1pZighdGhpcy5NKGEpKXt0aGlzLk4oYSk7KG5ldyBpYyhhLHRoaXMuRykpLmYoKTt0aGlzLlAoKTtyZXR1cm59fXRoaXMuUCgpfX0pfSkoYyk7dmFyIGpjPWMua2p8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLkJsfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLkppfHxtYzsoZnVuY3Rpb24oYyl7Yy5JaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5BZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5BZS5iaW5kKHRoaXMpLDEwMCl9LEFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5JaXx8bmM7KGZ1bmN0aW9uKGMpe2MuS2k9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxUYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLlAoKTp0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBuYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5QKCl9fSl9KShjKTt2YXIgb2M9Yy5LaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuaGt8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5OZD1bXTt0aGlzLnlmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5Zaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmdtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnlmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy55ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5OZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxnbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy55ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxBbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV0uJGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5OZFthXS4kYil9fX0pKGMpO3ZhciByYz0KYy5Zanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy50bnx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGwuV28pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGwuam4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTWUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5EbHx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLk1iPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi53YigibmV3QWRkZWxpdmVyeSIpfWMuTGk9YTthLnByb3RvdHlwZT17aW86ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApjbzpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LGJvOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LGFkOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnptKCkpdGhpcy5NYi5nKHRoaXMuTWIuUWMsdGhpcy5NYi5xYSx0aGlzLk1iLnhmLGZ1bmN0aW9uKCl7dGhpcy5hZChhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTWIuamMpO2Vsc2UgaWYoay5EYiYmIWsuSGkpay5YbShmdW5jdGlvbigpe3RoaXMuYWQoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhsLkljLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5DbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLndiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTWIsaCk7bS4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmZmJiYoZD10aGlzLnBsYXllci5mZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5oZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx6bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LHNvOmZ1bmN0aW9uKCl7Zi53YigicHJlcm9sbCIpO2YuRWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuYWQoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX0scm86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRWYoInBvc3Ryb2xsIik7Zi53YigicG9zdHJvbGwiKTt0aGlzLmlvKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLmFkKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxUbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBvKHRoaXMucm8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sU2Q6ZnVuY3Rpb24oYSl7Zi53YigibWlkcm9sbCIpO2YuRWYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5hZChjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8obC53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxTbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmhvKHRoaXMuU2QuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGYoKX0sZjpmdW5jdGlvbigpe3RoaXMuc28oKTt0aGlzLnBsYXllci5sZiYmdGhpcy5TbigpO3RoaXMuVG4oKX19fSkoYyk7dmFyIGZhPWMuTGl8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy5pa3x8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFBoZVhhaWtpY2h1eGFUYWgsUGhlWGFpa2ljaHV4YVRhaCk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.219.73.48
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 E10D
|
265 B
436 B
|
26ms
26ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
General
- Full URL
- https://videos.giga.de/homad/giga-ssl.json?cache=8778366887
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFBoZVhhaWtpY2h1eGFUYWg9UGhlWGFpa2ljaHV4YVRhaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnhuKWsueWwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsayl9KX1rLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5aaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmspeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8obC5JYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9rLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5jbyhrKTtiLmJvKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGsuQWIubGVuZ3RoKXt2YXIgYj1rLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmxvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09aztmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxrKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5aaz0hMTt0aGlzLk9iPSJzZXR1cCI7dGhpcy5iZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRm4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxtYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxGbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5FbihiLmRhdGEpfSxFbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5UYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuT2woYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy53bChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxhbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sd2w6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGY9YltxXS5zcGxpdCgiOiIpLApkPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGY9ZC5zcGxpdCgiLSIpLGQ9ZlswXSt0aGlzLmFsKGZbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscT0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtxPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHEmJihmPTEwMC9xKmQqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFRiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZT0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZSs9Zy50b1N0cmluZygxNik7cmV0dXJuIGV9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHEsZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsbD0yNzE3MzM4Nzgsaz0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcT1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO3E9YztuPWg7bT16O3k9bDt0PWs7Zm9yKGc9MDsxOT49ZztnKyspcD1kKHEsNSkrKG4mbXx+biZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9MjA7Mzk+PWc7ZysrKXA9ZChxLDUpKyhuXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTQwOzU5Pj1nO2crKylwPWQocSw1KSsobiZtfG4meXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz02MDs3OT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Yz1jK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cmw9bCt5JjQyOTQ5NjcyOTU7az1rK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShsKSthKGspKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHEsZixjLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxxPWIuY2hhckNvZGVBdCh6KyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8cT4+NixoPXEmNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKHEpJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxobDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHE9ITEsZj0hMSxjPSExLGg9ITEsej0hMSxsPSExLGs9ITE7dHJ5e2E9dGhpcy5obCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZ2M/ITA6ITF9Y2F0Y2godCl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxrPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1xO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1sO2IuaXNCbGluaz1rO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17Tmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sU2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxWazpmdW5jdGlvbigpe3JldHVybiBiLk5pKCl8fApiLlVpKCl8fGIud20oKXx8Yi5TaigpfHxiLnhrKCl8fGIuSGooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuVmsoKX0sVWw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGUpe2EmJihkLnF1ZXJ5S2V5W2FdPQplKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxobTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuT2I9Yn0sTWU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5PYjt0aGlzLnVlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnhuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5NZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1sLlRhKGEsZCkpO2EmJih4PWwuVGEoYixhKSk7ZyYmKHg9bC5UYSh4LGcpKTtxJiYoeD1sLlRhKHgscSkpO2MmJih4PWwuVGEoeCxjKSk7aCYmKHg9bC5UYSh4LGMpKTtmLkxjKHgpfSxHbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmhtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5tYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuR24oYik7aWYoYSlpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWsucmMoKTtrLndhKGIsITApO2I9ay53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtrLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFrfHwhay5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihrLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9ay5yYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7ay53YShnLCEwKTtnPWsud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ay5MYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSx2YzpmdW5jdGlvbihiKXtpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmMoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWsucmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9ay53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtrLkxhKGQpfX0samY6ZnVuY3Rpb24oKXtrJiZrLlM/ay5pc0VuYWJsZWQmJmsuaWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihmWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBjPSExO2Q9ITE7ZD10aGlzLmViKGIsYS5BYSxmLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9CiExfWMudXJsJiZjLmhhc2gmJihjPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuUGsoYyxiKTtyZXR1cm4gY30sZWI6ZnVuY3Rpb24oYixhLGQsZyxmLGMsaCx4KXt2YXIgbD1jfHxrO2M9ITA7eCYmKGM9ITEpO2lmKGwmJmwuUylpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2wud2EoYixjKTtjPWwud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWMuZGF0YVt0XT1kW3RdO3JldHVybiBsLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZCxnLGYsbCxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFRjOmZ1bmN0aW9uKGIsYSxkLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGwgaW4gaClkKz0iJiIrbCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbbF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGs9bmV3IFhNTEh0dHBSZXF1ZXN0O2sub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWsucmVhZHlTdGF0ZXx8MjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1c3x8ZyhrKTtmJiY0PT1rLnJlYWR5U3RhdGUmJjIwMCE9ay5zdGF0dXMmJjIwMSE9ay5zdGF0dXMmJmYoayl9O3RyeXtrLm9wZW4oYSxiLHgpLGsud2l0aENyZWRlbnRpYWxzPWMsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBrfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5UYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYmQpZm9yKHZhciBjIGluIHRoaXMuYmQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5iZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlVtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmJkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsZil7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxXazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxGaTpmdW5jdGlvbigpe2smJmsuUz9mLnRyYWNrKCJzdGF0c19oZF9wbGF5aW5nX3N1bSIsay5FYiwhMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZpKCl9LmJpbmQodGhpcyksNTAwKX0sRWk6ZnVuY3Rpb24oYil7ayYmay5TP2suRWImJmYudmMoWyJzdGF0c19oZF9lcnJvcmNvZGU6IitiLCJzdGF0c19oZF9lcnJvcmNvZGVfc3VtIl0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FaShiKX0uYmluZCh0aGlzKSw1MDApfX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPQpiW2ddO3JldHVybiBkfTthLnluPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTthLmhuPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVwPXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIiwKbmFtZToiYWRNaWRQb2ludCJ9O2Eudmc9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTthLkhrPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTthLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuYXA9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS52cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2EuS2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07YS51bD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2Eud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5JYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9OwphLnJlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTthLnRlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07YS5Jaz17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5sbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudHA9Cntjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlhvPXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGw9Yy5wanx8bDtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYudm09YTthLnByb3RvdHlwZT0Ke319KShjKTt2YXIgamE9Yy52bXx8amE7bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5yaj1hO2EucHJvdG90eXBlPXtUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZyxmO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoZj1iLmxlbmd0aDtkPGY7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxkbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrCiIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLkVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfSx5bTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhKCkrIjIifSx4aDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLlRlKHRoaXMuZG0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fQp2YXIgYj0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87YS5leHRlbmQ9ZnVuY3Rpb24oZSl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZz1PYmplY3QuY3JlYXRlKGQpLGY7Zm9yKGYgaW4gZSlnW2ZdPSJmdW5jdGlvbiI9PT10eXBlb2YgZVtmXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbZl0mJmIudGVzdChlW2ZdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGYsZVtmXSk6ZVtmXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2YuWmk9YX0pKGMpO3ZhciBLPWMuWml8fApLO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxhPWMuRmt8fGxhO25ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5NYT17fTt0aGlzLkc9bnVsbDt0aGlzLlljPTEwMDt0aGlzLlViPTA7dGhpcy5WYT0xNTA7dGhpcy4kYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlViPD10aGlzLlZhPyh0aGlzLlViKyssdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSk6MD50aGlzLlZhJiYodGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSl9LFluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWI+CnRoaXMuVmE/ITA6ITF9LHpmOmZ1bmN0aW9uKCl7dGhpcy5VYj0wfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sZW86ZnVuY3Rpb24oYSl7dGhpcy5HPWF9LGJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sTjpmdW5jdGlvbihhKXt0aGlzLk1hW2Eua2EoKV09YTtMJiZMLkRoJiZMLkFvKGEpfSxmcTpmdW5jdGlvbigpe3JldHVybiBmLlJlKHRoaXMuTWEpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9CnRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLlljPTEwO3RoaXMuVWI9MDt0aGlzLlZhPTUwO3RoaXMuWD1udWxsO3RoaXMuaGE9ITE7dGhpcy5wbGF5ZXI9YTt0aGlzLk5iPSIiO3RoaXMuUWc9ITE7dGhpcy5KKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGdxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0saG86ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSxlcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVWI8PQp0aGlzLlZhJiYodGhpcy5VYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLHRoaXMuWWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuaWQ9YX0seXE6ZnVuY3Rpb24oKXt9LFc6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1hO3RoaXMucW0oKXx8dGhpcy5MaygpO3RoaXMuUWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxocTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApZZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmN1cnJlbnRUaW1lP2EuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk5iPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmJ9LApZaDpmdW5jdGlvbigpe3RoaXMuTmI9bnVsbH0sanE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLk5iJiYoYT0hMCk7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITApfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy52aWRlb1RhZztiJiZiLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkNrPSIzIjt0aGlzLmhkPTA7dGhpcy5ibj0zMDt0aGlzLmRjPVtdO3RoaXMub2I9W107dGhpcy55Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPQohMTt0aGlzLnN0YXR1cz10aGlzLmhkO3RoaXMuaWQ9Zi5WKDEwKTt0aGlzLkZmKGEpO3RoaXMuZm8oYil9LGY6ZnVuY3Rpb24oKXt9LGphOmZ1bmN0aW9uKCl7dGhpcy53aXx8KHRoaXMud2k9ITAsZi5qZigpKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlIoKTtRJiZRLnBjJiYhbWEmJihtYT0hMCxmLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLm1jKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5tYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKSxiPSEwLGU9bmV3IEk7d2luZG93W2UuZ2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0uaW5pdGlhdG9yIT1mLm1jKCkmJih0aGlzLkdmKCksYj0hMSk7cmV0dXJuIGJ9LEM6ZnVuY3Rpb24oYSxiKXt2YXIgZT0hMDthJiYoZT0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy54bSgpO2lmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5kYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5kYyYmMDx0aGlzLmRjLmxlbmd0aCYmCih0aGlzLmRjPWYudW5pcXVlKHRoaXMuZGMpLGYudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLmRjLmpvaW4oIiwiKSkpO2lmKHRoaXMub2Ipe2Zvcih2YXIgZT0wO2U8dGhpcy5vYi5sZW5ndGg7ZSsrKXRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPT10aGlzLnljW2FdJiZiLnB1c2godGhpcy5vYltlXS5kZXRhaWwpLHRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPHRoaXMueWNbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy55Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuQ2t9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZH0sb2c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLmtnfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5oZH0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihmKXtmLmZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPWEuUnA7Yj9iLnBhP2IucGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7dmFyIGE9ITEsZz0iIjtiLmdldEVycm9yJiYoYT1iLmdldEVycm9yKCkpO2F8fGIuZGV0YWlsLmdldEVycm9yJiYoYT1iLmRldGFpbC5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZSYmKGcrPWEuZ2V0RXJyb3JDb2RlKCkpO2EuZ2V0TWVzc2FnZSYmKGcrPWEuZ2V0TWVzc2FnZSgpKTtnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5nanx8cGE7KGZ1bmN0aW9uKGYpe2YuaGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuTGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkxqfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5uaD10aGlzLnhiPSExO3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YS5hdXRob3JpdHkmJmEuYXV0aG9yaXR5LmluZGV4T2YmJjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnRsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuOwphPXRoaXMudmlkZW9UYWcucGFyZW50Tm9kZS5wYXJlbnROb2RlfXRoaXMuVChhKX0sTGU6ZnVuY3Rpb24oKXtpZighdGhpcy54Yil7dmFyIGE9dGhpcy5OaCxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fCh0aGlzLnhiPSEwKTt0aGlzLlcoYil9fSxOYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmCjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe2IuZHVyYXRpb24mJmIucG9zaXRpb24mJjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LGxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTsKYi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5tZiYmKDAsdGhpcy5tZikoKX0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKCFhLmdldFN0YXRlfHwicGxheWluZyIhPWEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiYKYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxsYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGI9ITE7YS5nZXRWb2x1bWUmJmEuZ2V0Vm9sdW1lKCkmJihiPWEuZ2V0Vm9sdW1lKCkpO3JldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQWp8fHNhOyhmdW5jdGlvbihjKXtjLnpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuc2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLkhiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5IYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkhiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5IYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkhiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7Zm9yKHZhciBkPSJhZFBsYXkgYWRDb21wbGV0ZSBhZENsaWNrIGFkSW1wcmVzc2lvbiBhZE1ldGEgYWRTa2lwcGVkIGFkVGltZSIuc3BsaXQoIiAiKSxlPTA7ZTxkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuSGI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLmkoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChldmVudC5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpO2Eub24oInBsYXlsaXN0aXRlbSIsZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS50bD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTmI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/CnRoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnNlJiZ0aGlzLmkoKSl9LFltOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuS2U/dGhpcy5LZSsrOnRoaXMuS2U9MTp0aGlzLkplP3RoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy56anx8dGE7KGZ1bmN0aW9uKGMpe2MuQmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWWwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPQpbXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLnhifHx0aGlzLk0oZSl8fHRoaXMuRW0oZSl8fCh0aGlzLk4oZSksZT1uZXcgdGEoZSx0aGlzLkcpLGUuSigpLGUuZigpKX19dGhpcy5QKCl9fSxicTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxZbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQmp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkNsfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Yuc2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksCmE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFllOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5UYigxMCk7dGhpcy5WZj0hMDt0aGlzLkRjPXRoaXMudWg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmNsKCksdGhpcy56YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuRCgidC1vbmxpbmUuZGUiKT8KITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuSD9hLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYS5IJiZhLkguSWE/YS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkgmJmEuSC5JYT90eXBlb2YgYS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5wZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLAphLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5wYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueWU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9CnRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy50aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLlJuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkRjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkVjPSEwO2lmKGYuRCgiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmCmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5FY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxhcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGNsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0sCnpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkRjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGM/dGhpcy53KCk6KHRoaXMuZGEoITApLAp0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnVoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwKKGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGRsOmZ1bmN0aW9uKCl7dGhpcy5KY3x8KHRoaXMuSmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihhLmFkcyl7aWYodGhpcy5KYyE9YS5hZHMuc3RhdGUmJih0aGlzLkpjPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRsKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYKMTAwOT09dGhpcy5LKXJldHVybiEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl7dmFyIGE9ITE7Zi5UYygiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYil7Yj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVWwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fAoodGhpcy5WZj0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkModGhpcy5WZixmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbmw6ZnVuY3Rpb24oKXt0aGlzLmtxfHwoMTA8dGhpcy5ncD8odGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmdwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sWG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaHApe3RoaXMuaHA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMucmt8fHlhOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2VdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmCihhPWEucGxheWVyLnBsYXllcigpLGIucHVzaChhKSk7aWYoMDxmLlJlKGIpKXtmb3IodmFyIGUgaW4gYiliLmhhc093blByb3BlcnR5KGUpJiYoYT1uZXcgeGEoYltlXSksYS5oYXx8dGhpcy5NKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYSksKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLkFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5Bbnx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3RoaXMuc2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LEJuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTmIsZT10aGlzLmthKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLnBjJiYoMDw9ZS5pbmRleE9mKGQpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmCmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLlVqfHxSOyhmdW5jdGlvbihmKXtmLlRqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8KHRoaXMuUGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5QYisrLDE1PHRoaXMuUGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sCmVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmYihlLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCnRoaXMuSyk7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMuS2w9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5CbihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihmKXtmLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9CjE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPAphLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGU9bmV3IFIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgQ2EoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVmp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm1ufHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkRuPQphLnBvc2l0aW9uaW5nO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUud2lkdGg9YS53aWR0aDtlLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZS5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Uuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuRG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGUpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGIpfXRoaXMuVChlKTt0aGlzLlcoZSk7dGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLkNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DZCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1sOmZ1bmN0aW9uKCl7Zi56aCh0aGlzLkNkKTtmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTsKaWYoZi56aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLk0oYSkpKXt0aGlzLk4oYSk7KG5ldyBJYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Ibj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuSG58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSxNazpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5HaT0hMTt0aGlzLkxoPWQ7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmsmJmsuY2YodGhpcy5GYS51cmwpJiYhYyYmCihjb25zb2xlLmxvZygidGVzdDEiKSxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsInN0YXR1czAiLCEwKSk7ZyYmNCE9aC5yZWFkeVN0YXRlJiZnKGgpfS5iaW5kKHRoaXMpfWMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksayYmay5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTprLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLiRpPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxWbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYiwKYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17QXA6IkFkQ2xpY2tUaHJ1IixDcDoiQWRFcnJvciIsRHA6IkFkU3RvcHBlZCIsR3A6IkFkTGluZWFyQ2hhbmdlIixIcDoiQWRUYWdQYXJzZWQiLEtwOiJBZFZpZGVvQ29tcGxldGUiLE5wOiJBZExvYWRlZCIsT3A6IkFkU2tpcHBlZCIsUHA6IkFkU3RhcnRlZCIsRXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixGcDoiQWRJbXByZXNzaW9uIixCcDoiQWRDcmVhdGl2ZVZpZXciLElwOiJBZFZpZGVvTWlkcG9pbnQiLEpwOiJBZFBhdXNlZCIsTHA6IkFkVmlkZW9TdGFydCIsTXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5sZSxhW2RdKX0sVW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKCl7fSl9aWYodGhpcy5HYSYmdGhpcy5HYS5rZSlmb3IodmFyIGEgaW4gdGhpcy5HYS5rZSl0aGlzLkdhLmtlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuVm4oKTt0aGlzLkdhJiZ0aGlzLlVuKCl9fX0pKGMpO3ZhciBOYT1jLiRpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZmM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5XYj0iIjt0aGlzLmllPQoic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5iYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5YYj0iIjt0aGlzLlliPVtdO3RoaXMuWmI9W107dGhpcy5jZD1bXTt0aGlzLnVjPSIiO3RoaXMuSWI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm9jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMuRWI9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5GYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9CiExO3RoaXMuWmM9dGhpcy5QZD1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmZjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlFjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5XYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLApIT01BRF9BREJMT0NLRVI6dGhpcy5iYyx0ZXN0SGlkZTp0aGlzLlhiLHRlc3RUYWdzOnRoaXMuWWIsdGVzdFRhZ3NKUzp0aGlzLlpiLHRlc3RUYWdzWEhSOnRoaXMuY2QsdGVzdDNQQ29va2llOnRoaXMudWMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm9jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5FYixibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkZjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCwKYWRGYWxsYmFja0NvbmZpZzp0aGlzLmtkLHlpZWxkbGFiOnRoaXMuRGJ9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJgoodGhpcy5UZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUWM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuV2I9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5iYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuWGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYKKHRoaXMuWmI9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYodGhpcy5jZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudWM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm9jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLkViPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnNkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9CmIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLktmPWIuc2tpcEFsbG93ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxwbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09CiEwfSxabDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuV2soYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIiwKZj0iIixjPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuYmYoYik7Zj10aGlzLmFhKGIpO2c/KHRoaXMuU2MoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucmMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5mY3x8dGhpcy5xZCkmJihoPXRoaXMuZG4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5hbShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhkPWQuZXhlYyhiKSkmJihkWzJdfHxkWzVdKT9hPSEwOnRoaXMuU2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhiKSkmJmRbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFNjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYW06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihkIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2RdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuV3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxyYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYKKGE9ZC5mYWxsYmFjayk7cmV0dXJuIGF9LGNuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgbD1oW0JdLnNwbGl0KCI9Iik7Z1tsWzBdXT1sWzFdfWZvcih2YXIgayBpbiBhW2NdLnN1YnZhbHVlcylnW2tdPXRoaXMuSGgoZ1trXSxrLGFbY10uc3VidmFsdWVzW2tdKTtoPVtdO2ZvcihrIGluIGcpaC5wdXNoKGsrIj0iK2dba10pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9az1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWsucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sZG46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmZjJiYoYj10aGlzLmNuKGIsdGhpcy5mYykpO3JldHVybiBifSxsbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5mbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxmbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEua28oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmpvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxmLGMpe2s9dGhpczt0aGlzLmRmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1kO3RoaXMuY2U9Zzt0aGlzLmpjPWY7dGhpcy55YT1jfHx7fTt0aGlzLmxsKCk7dGhpcy5UbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlJtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5IYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkhjKCl9Y2F0Y2gobCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGQpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSx5bDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sVG06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUWMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMubm0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuSGMoKX0uYmluZCh0aGlzKSwhMCl9LFJtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlRiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChlKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmpjPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5qYz0hMSk7dGhpcy5qYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmpjP3RoaXMuamMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuTGMobC55bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbm06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5XYnx8dGhpcy5BYXx8dGhpcy5IYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxIYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5EKCJ3ZWIuZGUiKXx8Zi5EKCJnbXgubmV0Iil8fGYuRCgiZ214LmF0Iil8fGYuRCgiZ214LmNoIil8fGYuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLldiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5WZT1kLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLldiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucmMoKSksZD10aGlzLmFhKHRoaXMuV2IpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuV2IrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZT1hLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7aWYoIXRoaXMub2MmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm9jPSEwO3RoaXMuVWMoITApOwpyZXR1cm59fWU9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihlPSEwKX1jYXRjaChoKXt9aWYoIShlfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihkLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlhiPWQudGVzdGhpZGV8fCIiO3RoaXMuWmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5jZD1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudWM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5mYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZC5qc3BvcHVwc3x8ITE7dGhpcy5BYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkZjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWQueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1kLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm9jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5vYz0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLk9vKCkmJih0aGlzLlhifHx0aGlzLlpifHx0aGlzLllifHx0aGlzLmNkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuR28oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFhtOmZ1bmN0aW9uKGEpe3RoaXMuSGk9ITA7dmFyIGU9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZT10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZSkpLGU9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmUsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihlKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuVGModGhpcy5yYygpLCJQT1NUIixlLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBlPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztlPWUucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGUsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitlKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGUsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy5FYj0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0sRm86ZnVuY3Rpb24oKXtpZih0aGlzLlhiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5iYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuWGIpO2Uuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5YYik7ZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpOwphPWR9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKCkpLHRoaXMuS28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLlhkKHRoaXMuYmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5ZYj10aGlzLmNkKSYmdGhpcy5ZYi5sZW5ndGgpe3ZhciBkPXRoaXMuWWIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxLbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2YoKSYmZSgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZCgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5UYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGUuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBlKCl7dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlpiJiZ0aGlzLlpiLmxlbmd0aCl7dmFyIGQ9dGhpcy5aYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LExvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihlLGQpe2Q9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnVjKXRyeXtmLlRjKHRoaXMudWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSWI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixlPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLkViJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5ZaygpO3RoaXMudWMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5JYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLklifSl9LFlrOmZ1bmN0aW9uKCl7dGhpcy5aYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlpjLmlkPWYuVigxMCk7dGhpcy5aYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWmMpO3ZhciBhPXRoaXMuWmMuY29udGVudFdpbmRvdyxlPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5QZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxrbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucG0oKSl7dmFyIGE9dGhpcy5abCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGUsZCxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuR2k9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGdsOmZ1bmN0aW9uKCl7dGhpcy4kbXx8KHRoaXMuJG09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoZz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5TYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChlKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChlKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSxFbzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30saWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuJG8uYmluZCh0aGlzKSx0aGlzLlpvLmJpbmQodGhpcykpfSwkbzpmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbDt0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuSmwoKX0sWm86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5MYyhsLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuQWJbYV07InJlcXVlc3QiPT1lLnR5cGUmJmYuZWIoZS51cmwsZS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1lLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmdhKCldPXRoaXM7Zi5lYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxUYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPQoiIixkPTA7ZDxhO2QrKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZX0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPSIiLGQsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGV9LGFhOmZ1bmN0aW9uKGEpe3ZhciBlPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2VbZ11dPWFbZ118fCIiO2QucXVlcnlLZXk9e307ZFtlWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGUpe2ImJihkLnF1ZXJ5S2V5W2JdPWUpfSk7cmV0dXJuIGR9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9IiIsZSxkO2ZvcihlPTc7MDw9ZTtlLS0pZD1hPj4+NCplJjE1LGIrPWQudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChuJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGYsNSkrKG4mcHx+biZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWQoZiw1KSsobl5wXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1kKGYsNSkrKG4mcHxuJnJ8cCZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZChmLDUpKyhuXnBecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2Esaz1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Daj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuQ2p8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMua2M9dGhpcy5yZD0hMTt0aGlzLlVrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuWGs9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5vZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Taz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlhjPXRoaXMuVGQ9ITE7dGhpcy5GaD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLnBjPSExO3RoaXMudmw9Zi5WKDEwKTt0aGlzLlNiPWYuVigxMCk7dGhpcy5RYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy5hYz10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMueGM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Qbz10aGlzLkdiPXRoaXMuUmI9ITE7dGhpcy5CYz1bXTt0aGlzLnFjPXt9O3RoaXMudm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkdjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGU9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZX0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuT2ImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLndvKCk7Zi5vKGwuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxlLGQsZyl7dGhpcy5HYj0KZDt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5rbCgpLGc9ay5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLmFvKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZSxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZSxkKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy5hYz10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5xbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5CYz10aGlzLmFoKGEpO3RoaXMub2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMuam0oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGU9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZT10aGlzLmFoKGIucGFyZW50KSksZS5wdXNoKHRoaXMuVGwoYikpKTtyZXR1cm4gZX0sVGw6ZnVuY3Rpb24oYSl7dmFyIGU9IiIsZD1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2U9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylkLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDplLGNyZWF0aXZlSUQ6ZH19LGptOmZ1bmN0aW9uKGEpe3ZhciBlPVtdLGQ9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGUubGVuZ3RoO2grKylkLnB1c2goYS51YihlW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZT0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGU9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZT1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTplPT1GLm1lLmNvZGU/Zi5vKGwudXAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGU9PUYuaGcuY29kZSYmZi5vKGwuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGwuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnhvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSWImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5JYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhsLmFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8obC52cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhsLndwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8obC5obix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8obC5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8obC5Zbyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMubGMoYSk7dGhpcy5SYSgpfSxsYzpmdW5jdGlvbihhKXt2YXIgZT05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZT1hLmVycm9yLmNvZGUsOTAxPGUmJihlPTkwMCkpO2ZvcihlPXsiW0VSUk9SQ09ERV0iOmV9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLmdmKGQudXJsLGQudHlwZSxlKX1jYXRjaChnKXt9fSxxbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBlPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGU9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1lO2U9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2QmJmQuZW52dmFycyYmKGc9ZC5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRmQmJihnPWQuRmQoKSk7Zy52aWRlb1Nsb3QmJihlPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31lLnZxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihlLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZS5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZS5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5TayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGUudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZS5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZSxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLndmJiZlLmxvYWQoKTtpZih0aGlzLm1pKGUpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGUpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWU6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpfWNhdGNoKGspe3RoaXMudmlkZW89CmV9fWVsc2UgdGhpcy5iLnJsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxvbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnhjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGwuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlJrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVmIoIm11dGVkIiwiY29udGVudCIpO2YubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRix0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5tbSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGsuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRiwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8obC5JYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5uYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5CYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmpwKCksdGhpcy5hLm5jKCEwKSwhdGhpcy5hYykpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5hYz17ZWw6dGhpcy5GLGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8obC5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubmMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5uYyghMCksdGhpcy5ycCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5wcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm9wKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhsLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5GY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMua3AoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnRjKCkpLHRoaXMubHAoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlZiKCJtdXRlZCIsInVzZXIiKSxmLm8obC5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVmIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGwuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGwudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkYsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxrcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnhjPSEwfSxscDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54Yz0hMX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8obC51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8obC50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHBwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhsLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sb3A6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGU9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7Zi5EZSgpO3RoaXMuRj0hMTt0aGlzLlJhKGEpfX0saXA6ZnVuY3Rpb24oYSl7dmFyIGU9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZSYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZT1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZS5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhsLnRwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApOazpmdW5jdGlvbihhLGUpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuU2MoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZChlLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuZnAuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChlLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmtjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2N8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuVWspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlJiJiYhdGhpcy5rYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUmJ8fCh0aGlzLlJiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGUpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuY3AoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuYnAoKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLnZpZGVvLnBsYXkoKTtpZihlJiZlWyJjYXRjaCJdKWVbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5zYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnNjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8obC5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPVtdLGQ9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWQ9Zi5maChhW2ddKSxlLnB1c2goZCk7YT17aGFzaGVzOmV9O2E9bC5UYShhLHRoaXMudSgpKTtmLnVvKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Layh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhsLmxuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkZifHx0aGlzLmIuemMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmtjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZSl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5wYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRmImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIuemMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSxmcDpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmtjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5nbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5wYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhsLkljLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlNvKGEpO2lmKCF0aGlzLmFjKXt2YXIgZT0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuYWM9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhsLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmUscGVyY2VudDpkLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX1kPSIiO3RoaXMuYi5MZiYmKGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuTGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhsLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkZiPyh0aGlzLmtjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxlLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFNvOmZ1bmN0aW9uKGEpe2YubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5SYnx8KDA9PWEmJih0aGlzLkdiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLkdiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5JYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSWIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5SYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGwudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8obC5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGUpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZSwhMCl9LHdvOmZ1bmN0aW9uKCl7Zi52YyhbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YudmMoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtmLnZjKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi52YyhbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFZiOmZ1bmN0aW9uKGEsZSl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZSwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZSl7aWYoIXRoaXMuUmIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5rbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGM9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkdjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGwuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZSl0cnl7dGhpcy5iLlBhPXRoaXMuemwodGhpcy5iLlBhLGEpfWNhdGNoKGspe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZT0iIjt0aGlzLmNnJiYoZT0iX3ZwYWlkIik7dGhpcy5kZCYmKGU9Il93ZWxlY3QiKTtyZXR1cm4gYStlfSxnZjpmdW5jdGlvbihhLGUsZCxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihlPXRoaXMuQS53YShhKSxkJiZlLk1rKGQpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuT2soYSksdGhpcy5BLkxhKGUsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE9rOmZ1bmN0aW9uKGEpe3RoaXMucWNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5xY1thXT0iY2xvc2VkIn0sb2w6ZnVuY3Rpb24oKXt0aGlzLnFjPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZTtmb3IoZSBpbiB0aGlzLnFjKXRoaXMucWMuaGFzT3duUHJvcGVydHkoZSkmJiJvcGVuIj09dGhpcy5xY1tlXSYmYSsrO3JldHVybiBhfSxrbTpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1lfSl9LHpsOmZ1bmN0aW9uKGEsZSl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1lfSl9LGNwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy50YygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGUpe31mLm8obC5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRmN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZSl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxicDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBlPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGU9dGhpcy5BLnRkKTtlJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLktiLmJpbmQodGhpcyksMUUzKmUpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sS2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMudmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuU2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlFiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Sby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5MYigpO3RoaXMuS2IoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZkLmFwcGVuZENoaWxkKGgpO2QuYXBwZW5kQ2hpbGQoYyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuTGIoKTt0aGlzLktiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUud2lkdGg9IjEwMCUiLGUuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGUuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGUuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLAplLnN0eWxlLmJvdHRvbT0iMHB4IixlLnN0eWxlLnpJbmRleD0iMTAwMDAiLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmUuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGUpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhsLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLkxiKCl9fSxMYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHRjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlNiKTt0aGlzLnhjPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMueGM9ITEpOihmLm1hKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy54Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGwucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwidXNlciIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVmIoIm11dGVkIiwidXNlciIpLGYubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5WYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGwuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5RYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxzYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5zYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEuRWJ8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuT2ImJnRoaXMuVG8oKXx8KHRoaXMueWQ9ITAsdGhpcy5HYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5HYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGU9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixkPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZStkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZT1rLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGN8fChhPQohMCxlLmFkRmFsbGJhY2tVUkx8fChlLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkdjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuR2M/ImFueSI6IiIpKyhlLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5YYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuR2MmJmUuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhjfSwkbDpmdW5jdGlvbigpe3ZhciBhPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxlPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1lLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZS5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmUuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBlPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuJGwoKTt0aGlzLkdjPXRoaXMuWGM9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBlPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2UsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy52bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlpuKCksdGhpcy5wYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhsLnVsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5GYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5CYyYmMDx0aGlzLkJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5CYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5YaysiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5Fa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtlPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy5BYz10aGlzLkNjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGUsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGU9IiI7Yi5xdWVyeUtleSYmKGU9Yi5xdWVyeUtleS5odnApO2UmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmsud2Eoay5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihmLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuRCgiZmFuZG9tLmNvbSIpfHxmLkQoImdpZ2EuZGUiKXx8Zi5EKCJraW5vLmRlIil8fGYuRCgic3BpZWxldGlwcHMuZGUiKXx8Zi5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuRCgiZ2lnYS5kZSIpfHxmLkQoImtpbm8uZGUiKXx8Zi5EKCJzcGllbGV0aXBwcy5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxsKCl8fG0oKXx8ImFwcHNwb3QiPT1lKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChrLldkKGgpKSsiJnR5cGU9anMiLGI9ay53YShrLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9ay53YShrLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9ay5MYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixlKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk9iKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtlW2JdPXt9fWVsc2UgZS5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBlPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5PYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuT2J8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGsuRW8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZDtlLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWUucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZSk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxlPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1lPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkpuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5XYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGUpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuV2MoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFdjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxlLHtBZFN5c3RlbTp0aGlzLlNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlZvKCkmJnRoaXMudGYodGhpcy54bCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5DYz8odGhpcy5DYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuV2MoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLkFjPyh0aGlzLkFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLldjKCkpOnRoaXMucGFyZW50LkloKCl9LFZvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLk5jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRmI9YS5GYj9hLkZiOnRoaXMuQ2M7YS56Yz1hLnpjP2EuemM6dGhpcy5BYzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3RoaXMucGFyZW50LnRmKGEpfSx4bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk5jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuVmwoKTthLkNxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUmwoKTthLkxmPXRoaXMuaW0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZT0hMTsoZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZlLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLldsKCkpOmEuUGEuY29uY2F0KHRoaXMuZW0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5sYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmxjJiZ0aGlzLnBhcmVudC5sYyhhKSxiPTAsdGhpcy5XYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxsYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5sYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGU9bmV3IFRhKGEsYik7ZS5vcmlnaW49dGhpcztyZXR1cm4gZX0sTW86ZnVuY3Rpb24oKXtyZXR1cm4gYjxlfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5OYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxKbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZSl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFNsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGQ9YVtlXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZCYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZSl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspYi5wdXNoKHtpZDphW2VdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZV0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtlXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2VdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZV0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxYcDphW2VdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2VdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxSbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZT0hMSxkPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZT1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2U9Yn1kLnB1c2goZSk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZCxoPWMpOihiPWUsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGltOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGU9ITEsZD0hMTt0cnl7ZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9ZS5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYudG8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5hbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMuemM9dGhpcy5GYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLldqPWE7YS5wcm90b3R5cGU9e3JsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTy5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGNtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGU9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShlPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZS5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2RdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmNtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxtbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk8ubGVuZ3RoO2UrKylpZigwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tlXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuV2p8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMubWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0seHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx5cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLk9tfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWU7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Eanx8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1lO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuZXA9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnpwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy5aaFthXSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ycT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Xbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Qbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzpkLGZyYW1lOmYsd246Yyx2ZW5kb3I6ZS5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMucWYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy5xZltlXTtkLnR5cGU9PT1hJiZkLiRrKHRoaXMuWGwoYSkpfX0sWGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7QXE6ITAsenE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7b3E6InZpZGVvIixEcToianNDdXN0b20iLEVxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRnE6MSxZcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxsbTpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMuYmUubGVuZ3RoO2UrKylpZih0aGlzLmJlW2VdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZV0ud247cmV0dXJuIiJ9LFduOmZ1bmN0aW9uKGEsZSl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5sbShlKSx2ZW5kb3I6ZX0pO3RoaXMudm8oKX0sUG46ZnVuY3Rpb24oYSxlKXsidmlkZW8iPT09YT90aGlzLmVwLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZSl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxlKX0semc6ZnVuY3Rpb24oYSxlKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKJGs6ZSx4cTohMX0pfSx2bzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLnFxKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkJxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLnNtfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuY29uZj1lfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5nYz1bXX1jLmFqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBlPXt9LGQ9ITEsYz0wLGU9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixjPWUubGVmdCxlPWUudG9wKTtmPXt4OmMseTplfTtmLnBvc2l0aW9uPWQ7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBlPTAsZD0wLGM9ITEsZj10aGlzLnVtKGEpLGg9e307YTspZSs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGUrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZSx5OmR9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSxDbzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8obC5JYyx0aGlzLmMubCgpKX0sWm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8obC53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy4kYyYmdGhpcy5jLiRjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxlJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxObDpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmdldFBvc2l0aW9uKGEpO2UucG9zaXRpb24/ZS5wb3NpdGlvbj1lLnBvc2l0aW9uOmUucG9zaXRpb249ImFic29sdXRlIjtlLndpZHRoPWEub2Zmc2V0V2lkdGg7ZS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGV9LG5jOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuTmwodGhpcy50Yik7aWYoZS54IT10aGlzLkhhLnh8fGUueSE9dGhpcy5IYS55fHxlLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxlLndpZHRoIT10aGlzLkhhLndpZHRofHxlLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZS53aWR0aCYmMD09ZS5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1lO3RoaXMuYy4kYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmUueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZS55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1lLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdGhpcy5nY1thXSh7d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5nYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5hanx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMudW58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1lKWEuY29udGFpbmVySWQ9ZS5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Qaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmVjPXRoaXMuZWN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTmI7YSYmYS5wYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZWMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZT0wO2U8Yi5tb2R1bGVzLmxlbmd0aDtlKyspe3ZhciBkPWIubW9kdWxlc1tlXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuVnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5tcSgpOiExfSxOYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTmMoKTotMX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5lYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmVjfHwzMDI9PXRoaXMuZWM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZWMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5mbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Qanx8Y2I7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy4kai5Eay5Caz93aW5kb3cuT08uJGouRGsuQmsuVHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IGNiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlJqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMucW58fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlNpfHxnYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZT1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxlPWEuZGF0YS5tZXNzYWdlKTtmLkQoIndlbHQuZGUiKSYmIXRoaXMuc24mJih0aGlzLnNuPSEwLGYuRWkoYikpOzEyMDUhPWImJig5MDA9PWImJjA8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRWcoYS5hZEVycm9yRXZlbnRzKTsKYS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe2YuRCgid2VsdC5kZSIpJiYhdGhpcy5ybiYmKHRoaXMucm49ITAsZi5GaSgpKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaGI9Yy5SaXx8aGI7KGZ1bmN0aW9uKGMpe2MuVGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxVaDpmdW5jdGlvbihhKXthPW5ldyBnYihhKTthLmhhP3RoaXMuUCgpOnRoaXMuTShhKXx8KGEuUWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLk4oYSksKG5ldyBoYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1sfHwodGhpcy5NbD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuVWgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlVoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgaWI9Yy5UaXx8aWIsVD1uZXcgaWIodCk7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgamI9Yy5RbHx8amI7bmV3IGpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmtrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYSl7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGEpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ra3x8VTsoZnVuY3Rpb24oYyl7Yy5qaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3Lm5kKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLnBuKGEpfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpOwp3Lm5kKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5vbSgpfSxwbjpmdW5jdGlvbihhKXt2YXIgYj0iIixlO2ZvcihlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSl7Yj1pc05hTihhW2VdKT8hMTphW2VdO2lmKDEwMDk9PWFbZV18fDEwMDE9PWFbZV18fDMwMz09YVtlXXx8NDAzPT1hW2VdKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2VdKWlmKGFbZV0uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbZV1bZF0pPyExOmFbZV1bZF0sMTAwOT09YVtlXVtkXXx8MTAwMT09YVtlXVtkXXx8MzAzPT1hW2VdW2RdfHw0MDM9PWFbZV1bZF0pKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufX10aGlzLm0oImFkZXJyb3IiLGIpO3RoaXMuQygpfX0pfSkoYyk7dmFyIFY9Yy5qa3x8VjsoZnVuY3Rpb24oYyl7Yy5saz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO3RoaXMuTGQmJihhPWYuQWwoYSx0aGlzLkxkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTShkKSl7dGhpcy5OKGQpO3ZhciBjPW5ldyBWKGQsdGhpcy5HKTtjLmYoKX19Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IoZT1hW2JdO2UucGFyZW50RWxlbWVudDspe3ZhciBlPWUucGFyZW50RWxlbWVudCxoPWUuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5MZHx8Cih0aGlzLkxkPVtdKSx0aGlzLkxkLnB1c2goYVtiXSksZD1uZXcgVShoKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksYz1uZXcgVihkLHRoaXMuRyksYy5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxuZDpmdW5jdGlvbihhLGIsZSl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYV18fCh0aGlzLmNhW2FdPXt9KTt0aGlzLmNhW2FdW2JdfHwodGhpcy5jYVthXVtiXT1bXSk7dGhpcy5jYVthXVtiXS5wdXNoKGUpfSxObzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVtiXSl0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGEpLHRoaXMuWW4oKSYmKHRoaXMuemYoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgZT0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihlPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtiXVtlXSYmMDx0aGlzLmNhW2JdW2VdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2JdW2VdLmxlbmd0aDtkKyspdGhpcy5jYVtiXVtlXVtkXShhKX19LG9tOmZ1bmN0aW9uKCl7aWYodGhpcy5WYylmb3IodmFyIGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5WY1thXSxlPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbZV1bZF0mJjA8dGhpcy5jYVtlXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmNhW2VdW2RdLmxlbmd0aDtjKyspdGhpcy5jYVtlXVtkXVtjXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1hLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9YS5vRXZlbnRUeXBlLmgmJncuTm8oYSl9fSl9KShjKTt2YXIga2I9Yy5sa3x8a2Isdz1uZXcga2IodCk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5FbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBsYXkoKX0pfSwKdWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLk9pfHxtYjsoZnVuY3Rpb24oYyl7Yy5QaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIithKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5QaXx8bmI7KGZ1bmN0aW9uKGMpe2MuUWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYSYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT0KYVtiXSxkPSIiO3RyeXtkPWUuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGMpe2Q9ZS5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgbWIoZCk7dGhpcy5NKGYpfHwodGhpcy5OKGYpLChuZXcgbmIoZix0aGlzLkcpKS5mKCkpfWNhdGNoKGgpe319dGhpcy5QKCl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGUgaW4gdGhpcy5NYSlpZihiPT10aGlzLk1hW2VdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5RaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFiPWMuem58fHFiO25ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy5wbHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSksdGhpcy5wbD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSmcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz1hLnNvdXJjZS5DSE9PU0VSX0FCfHwiIixoPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYywhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9pbnRlcmFjdGlvbiIsCmMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLkpnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuTm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmljfHwodGhpcy5pYz1bXSk7dGhpcy5pYy5wdXNoKGEpfSxxbDpmdW5jdGlvbigpe2lmKHRoaXMuaWMmJnRoaXMuaWMubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5pYy5sZW5ndGg7YSsrKXRyeXt0aGlzLmljW2FdKCl9Y2F0Y2goYil7fX0sRmQ6ZnVuY3Rpb24oKXtpZih0aGlzLktjKXJldHVybiB0aGlzLktjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE5uOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuTmp8fHJiOyhmdW5jdGlvbihjKXtjLk1qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5EaT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMuRGkmJih0aGlzLmkoKSx0aGlzLkRpPSEwLHRoaXMubmEoKSk7Yi5VYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSWV8fCh0aGlzLkllPTEpLHRoaXMuSWUrKywxMDA8dGhpcy5JZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTWp8fHNiOyhmdW5jdGlvbihjKXtjLk9qPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7Zi50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgZT0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspZT0KbmV3IHJiKGFbZF0pLHRoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IHNiKGUsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciB0Yj1jLk9qfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlRrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdmI9Yy52a3x8dmI7KGZ1bmN0aW9uKGMpe2MudWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LExuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMuRGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuTG4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuRGMpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5oYltiXSYmMzAzIT10aGlzLmhiW2JdJiY0MDMhPXRoaXMuaGJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLmphKCk7CmVsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy51a3x8d2I7KGZ1bmN0aW9uKGMpe2Mud2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBlPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuTShlKXx8LTE9PWUuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihlKSwobmV3IHdiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB4Yj1jLndrfHx4Yix5Yj1uZXcgeGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgemI9Yy5HbHx8emI7bmV3IHpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmRrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnVmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5DbigpfS5iaW5kKHRoaXMpLDUwMCl9LENuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnVmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LHlvOmZ1bmN0aW9uKCl7dGhpcy51Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuZGt8fEFiOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5abT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMud2N8fCh0aGlzLndjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLndjfHx0aGlzLndjKyssdGhpcy53Yzw9dGhpcy5abT8odGhpcy53YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkueW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuY2t8fEJiOyhmdW5jdGlvbihjKXtjLmVrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBCYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIENiPWMuZWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkZsfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5iaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE5hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5ia3x8RmI7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVWEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5RbSgpOnRoaXMuR2coKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxzbDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sUW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpiKCk7IWEucGEmJmEuWSYmYS5TcCYmYS5VcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEdnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgZTthOnthPWEuZ2V0RXJyb3IoKTtmb3IoZSBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtlXSl7ZT1hW2VdO2JyZWFrIGF9ZT12b2lkIDB9MTAwOT09ZXx8MzAzPT1lfHw0MDM9PQplPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGUpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5KYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5VYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sbnE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSmIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuYWt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0samw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IEdiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLmpsKGFbYl0pO3RoaXMuUCgpfX0pO2MuZ2QuSmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBkPQpiW2VdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0mJmJbZV0uZmVybW9kJiZhLnB1c2goYltlXS5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy52anx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sJGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVWE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLkpqfHxYOyhmdW5jdGlvbihjKXtjLklqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnZmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMudmY9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGU9YS5wbGF5ZXJDb250YWluZXI7ZSYmdGhpcy52ZiYmZSE9dGhpcy52Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLkQoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLnNxKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSWp8fFk7KGZ1bmN0aW9uKGMpe2MuS2o9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLAplPWIubGVuZ3RoLGQ9MDtkPGU7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLnpmKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBHLEtiPWMuS2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5ZaXx8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubWo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxlPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksZT1hLkdldEVsKCksYiYmZT8odGhpcy5UKGUpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5tanx8TmI7KGZ1bmN0aW9uKGMpe2MubGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxCZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksZT0wO2U8Yi5sZW5ndGg7ZSsrKXRoaXMuaGFuZGxlRXJyb3IoYltlXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLmxqfHxPYjsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgTmIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgT2IoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFBiPWMubmp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmJqfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGU9ITE7YT8oZT1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZlPyh0aGlzLlQoZSksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuVml8fFNiOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy5XaXx8VGI7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGU9bmV3IFNiKGFbYl0pO2UuaGF8fHRoaXMuTShlKXx8KHRoaXMuTihlKSx3aW5kb3cuYnJpZHBsYXllcj1lLChuZXcgVGIoZSx0aGlzLkcpKS5mKCkpfX10aGlzLlAoKX19KX0pKGMpO3ZhciBVYj1jLlhpfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMubm58fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSwkZDpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LE1uOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuemt8fFhiOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmhjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0saGM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkdrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuR2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmhjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuUW4oKX0sUW46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5Lbj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5Lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmhjKGEpKX19KX0pKGMpO3ZhciBZYj1jLnlrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhLk1uKCksYT1uZXcgWWIoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMuQWt8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5kanx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2V8fChlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtlPyh0aGlzLlcoZSksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5lbj1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW59LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlpkKGEpfS5iaW5kKHRoaXMpKX0sWmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5va3x8TjsoZnVuY3Rpb24oYyl7Yy5uaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8Cih0aGlzLlBiPTApLHRoaXMuUGIrKywxNTx0aGlzLlBiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLm1vKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5LPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT0KYS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSYmYVtjXSYmYVtjXS5hZEVycm9yJiZhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMubmt8fE87KGZ1bmN0aW9uKGMpe2MucGs9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuemYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBiYz1jLnBrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5janx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ganx8WjsoZnVuY3Rpb24oYyl7Yy5Faj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuVGIoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy56YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx6YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRWp8fGFhOyhmdW5jdGlvbihjKXtjLkdqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGVjPWMuR2p8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLlBtfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLmpqfHxoYzsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5GZygpfSxGZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMuaWp8fAppYzsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuUCgpO3JldHVybn1pZighdGhpcy5NKGEpKXt0aGlzLk4oYSk7KG5ldyBpYyhhLHRoaXMuRykpLmYoKTt0aGlzLlAoKTtyZXR1cm59fXRoaXMuUCgpfX0pfSkoYyk7dmFyIGpjPWMua2p8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLkJsfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLkppfHxtYzsoZnVuY3Rpb24oYyl7Yy5JaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5BZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5BZS5iaW5kKHRoaXMpLDEwMCl9LEFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5JaXx8bmM7KGZ1bmN0aW9uKGMpe2MuS2k9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxUYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLlAoKTp0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBuYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5QKCl9fSl9KShjKTt2YXIgb2M9Yy5LaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuaGt8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5OZD1bXTt0aGlzLnlmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5Zaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmdtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnlmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy55ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5OZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxnbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy55ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxBbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV0uJGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5OZFthXS4kYil9fX0pKGMpO3ZhciByYz0KYy5Zanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy50bnx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGwuV28pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGwuam4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTWUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5EbHx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLk1iPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi53YigibmV3QWRkZWxpdmVyeSIpfWMuTGk9YTthLnByb3RvdHlwZT17aW86ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApjbzpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LGJvOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LGFkOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnptKCkpdGhpcy5NYi5nKHRoaXMuTWIuUWMsdGhpcy5NYi5xYSx0aGlzLk1iLnhmLGZ1bmN0aW9uKCl7dGhpcy5hZChhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTWIuamMpO2Vsc2UgaWYoay5EYiYmIWsuSGkpay5YbShmdW5jdGlvbigpe3RoaXMuYWQoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhsLkljLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5DbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLndiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTWIsaCk7bS4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmZmJiYoZD10aGlzLnBsYXllci5mZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5oZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx6bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LHNvOmZ1bmN0aW9uKCl7Zi53YigicHJlcm9sbCIpO2YuRWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuYWQoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX0scm86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRWYoInBvc3Ryb2xsIik7Zi53YigicG9zdHJvbGwiKTt0aGlzLmlvKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLmFkKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxUbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBvKHRoaXMucm8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sU2Q6ZnVuY3Rpb24oYSl7Zi53YigibWlkcm9sbCIpO2YuRWYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5hZChjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8obC53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxTbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmhvKHRoaXMuU2QuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGYoKX0sZjpmdW5jdGlvbigpe3RoaXMuc28oKTt0aGlzLnBsYXllci5sZiYmdGhpcy5TbigpO3RoaXMuVG4oKX19fSkoYyk7dmFyIGZhPWMuTGl8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy5pa3x8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFBoZVhhaWtpY2h1eGFUYWgsUGhlWGFpa2ljaHV4YVRhaCk7Cg==
- 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
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame FEB0
|
19 KB
8 KB
|
278ms
278ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4239789644939934&correlator=3372433528012710&output=ldjh&impl=fif&eid=21062453%2C21065304%2C21065305&vrg=2020022401&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200228&iu_parts=5286166%2Cgiga.de%2CDFP-Passback-728x90&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=728x90&eri=6&cookie=ID%3D94d42a64b4ca41ae%3AT%3D1582885280%3AS%3DALNI_MasJ3a9tMLdl8soV0lRepPm_fGz1Q&cdm=www.giga.de&bc=31&abxe=1&lmt=1582885280&dt=1582885280642&dlt=1582885280537&idt=99&ea=0&frm=23&biw=1585&bih=1200&isw=728&ish=90&oid=3&adxs=429&adys=125&adks=4143599050&ucis=9l5qw6vj2kgh&ifi=1&ifk=3893072602&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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&top=www.giga.de&dssz=8&icsg=42&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=169603703.1582885281&ga_sid=1582885281&ga_hid=1213424474&fws=256&ohw=0&btvi=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 46f190baa08195ca3af1de5ad0962db0ef9e010bf279655d1111781c83b7cb11
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020022401.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame FEB0
|
66 KB
24 KB
|
31ms
31ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame FEB0
|
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_2020022401.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 FEB0
|
215 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame E10D
|
754 B
1 KB
|
21ms
21ms
|
XHR
application/json |
13.225.73.19
AMAZON-02
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=8940769030
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFBoZVhhaWtpY2h1eGFUYWg9UGhlWGFpa2ljaHV4YVRhaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnhuKWsueWwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsayl9KX1rLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5aaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmspeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8obC5JYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9rLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5jbyhrKTtiLmJvKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGsuQWIubGVuZ3RoKXt2YXIgYj1rLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmxvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09aztmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxrKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5aaz0hMTt0aGlzLk9iPSJzZXR1cCI7dGhpcy5iZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRm4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxtYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxGbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5FbihiLmRhdGEpfSxFbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5UYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuT2woYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy53bChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxhbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sd2w6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGY9YltxXS5zcGxpdCgiOiIpLApkPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGY9ZC5zcGxpdCgiLSIpLGQ9ZlswXSt0aGlzLmFsKGZbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscT0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtxPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHEmJihmPTEwMC9xKmQqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFRiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZT0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZSs9Zy50b1N0cmluZygxNik7cmV0dXJuIGV9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHEsZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsbD0yNzE3MzM4Nzgsaz0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcT1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO3E9YztuPWg7bT16O3k9bDt0PWs7Zm9yKGc9MDsxOT49ZztnKyspcD1kKHEsNSkrKG4mbXx+biZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9MjA7Mzk+PWc7ZysrKXA9ZChxLDUpKyhuXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTQwOzU5Pj1nO2crKylwPWQocSw1KSsobiZtfG4meXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz02MDs3OT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Yz1jK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cmw9bCt5JjQyOTQ5NjcyOTU7az1rK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShsKSthKGspKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHEsZixjLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxxPWIuY2hhckNvZGVBdCh6KyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8cT4+NixoPXEmNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKHEpJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxobDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHE9ITEsZj0hMSxjPSExLGg9ITEsej0hMSxsPSExLGs9ITE7dHJ5e2E9dGhpcy5obCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZ2M/ITA6ITF9Y2F0Y2godCl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxrPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1xO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1sO2IuaXNCbGluaz1rO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17Tmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sU2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxWazpmdW5jdGlvbigpe3JldHVybiBiLk5pKCl8fApiLlVpKCl8fGIud20oKXx8Yi5TaigpfHxiLnhrKCl8fGIuSGooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuVmsoKX0sVWw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGUpe2EmJihkLnF1ZXJ5S2V5W2FdPQplKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxobTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuT2I9Yn0sTWU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5PYjt0aGlzLnVlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnhuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5NZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1sLlRhKGEsZCkpO2EmJih4PWwuVGEoYixhKSk7ZyYmKHg9bC5UYSh4LGcpKTtxJiYoeD1sLlRhKHgscSkpO2MmJih4PWwuVGEoeCxjKSk7aCYmKHg9bC5UYSh4LGMpKTtmLkxjKHgpfSxHbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmhtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5tYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuR24oYik7aWYoYSlpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWsucmMoKTtrLndhKGIsITApO2I9ay53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtrLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFrfHwhay5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihrLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9ay5yYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7ay53YShnLCEwKTtnPWsud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ay5MYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSx2YzpmdW5jdGlvbihiKXtpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmMoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWsucmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9ay53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtrLkxhKGQpfX0samY6ZnVuY3Rpb24oKXtrJiZrLlM/ay5pc0VuYWJsZWQmJmsuaWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihmWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBjPSExO2Q9ITE7ZD10aGlzLmViKGIsYS5BYSxmLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9CiExfWMudXJsJiZjLmhhc2gmJihjPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuUGsoYyxiKTtyZXR1cm4gY30sZWI6ZnVuY3Rpb24oYixhLGQsZyxmLGMsaCx4KXt2YXIgbD1jfHxrO2M9ITA7eCYmKGM9ITEpO2lmKGwmJmwuUylpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2wud2EoYixjKTtjPWwud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWMuZGF0YVt0XT1kW3RdO3JldHVybiBsLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZCxnLGYsbCxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFRjOmZ1bmN0aW9uKGIsYSxkLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGwgaW4gaClkKz0iJiIrbCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbbF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGs9bmV3IFhNTEh0dHBSZXF1ZXN0O2sub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWsucmVhZHlTdGF0ZXx8MjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1c3x8ZyhrKTtmJiY0PT1rLnJlYWR5U3RhdGUmJjIwMCE9ay5zdGF0dXMmJjIwMSE9ay5zdGF0dXMmJmYoayl9O3RyeXtrLm9wZW4oYSxiLHgpLGsud2l0aENyZWRlbnRpYWxzPWMsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBrfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5UYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYmQpZm9yKHZhciBjIGluIHRoaXMuYmQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5iZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlVtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmJkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsZil7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxXazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxGaTpmdW5jdGlvbigpe2smJmsuUz9mLnRyYWNrKCJzdGF0c19oZF9wbGF5aW5nX3N1bSIsay5FYiwhMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZpKCl9LmJpbmQodGhpcyksNTAwKX0sRWk6ZnVuY3Rpb24oYil7ayYmay5TP2suRWImJmYudmMoWyJzdGF0c19oZF9lcnJvcmNvZGU6IitiLCJzdGF0c19oZF9lcnJvcmNvZGVfc3VtIl0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FaShiKX0uYmluZCh0aGlzKSw1MDApfX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPQpiW2ddO3JldHVybiBkfTthLnluPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTthLmhuPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVwPXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIiwKbmFtZToiYWRNaWRQb2ludCJ9O2Eudmc9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTthLkhrPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTthLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuYXA9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS52cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2EuS2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07YS51bD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2Eud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5JYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9OwphLnJlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTthLnRlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07YS5Jaz17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5sbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudHA9Cntjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlhvPXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGw9Yy5wanx8bDtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYudm09YTthLnByb3RvdHlwZT0Ke319KShjKTt2YXIgamE9Yy52bXx8amE7bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5yaj1hO2EucHJvdG90eXBlPXtUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZyxmO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoZj1iLmxlbmd0aDtkPGY7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxkbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrCiIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLkVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfSx5bTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhKCkrIjIifSx4aDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLlRlKHRoaXMuZG0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fQp2YXIgYj0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87YS5leHRlbmQ9ZnVuY3Rpb24oZSl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZz1PYmplY3QuY3JlYXRlKGQpLGY7Zm9yKGYgaW4gZSlnW2ZdPSJmdW5jdGlvbiI9PT10eXBlb2YgZVtmXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbZl0mJmIudGVzdChlW2ZdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGYsZVtmXSk6ZVtmXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2YuWmk9YX0pKGMpO3ZhciBLPWMuWml8fApLO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxhPWMuRmt8fGxhO25ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5NYT17fTt0aGlzLkc9bnVsbDt0aGlzLlljPTEwMDt0aGlzLlViPTA7dGhpcy5WYT0xNTA7dGhpcy4kYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlViPD10aGlzLlZhPyh0aGlzLlViKyssdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSk6MD50aGlzLlZhJiYodGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSl9LFluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWI+CnRoaXMuVmE/ITA6ITF9LHpmOmZ1bmN0aW9uKCl7dGhpcy5VYj0wfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sZW86ZnVuY3Rpb24oYSl7dGhpcy5HPWF9LGJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sTjpmdW5jdGlvbihhKXt0aGlzLk1hW2Eua2EoKV09YTtMJiZMLkRoJiZMLkFvKGEpfSxmcTpmdW5jdGlvbigpe3JldHVybiBmLlJlKHRoaXMuTWEpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9CnRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLlljPTEwO3RoaXMuVWI9MDt0aGlzLlZhPTUwO3RoaXMuWD1udWxsO3RoaXMuaGE9ITE7dGhpcy5wbGF5ZXI9YTt0aGlzLk5iPSIiO3RoaXMuUWc9ITE7dGhpcy5KKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGdxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0saG86ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSxlcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVWI8PQp0aGlzLlZhJiYodGhpcy5VYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLHRoaXMuWWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuaWQ9YX0seXE6ZnVuY3Rpb24oKXt9LFc6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1hO3RoaXMucW0oKXx8dGhpcy5MaygpO3RoaXMuUWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxocTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApZZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmN1cnJlbnRUaW1lP2EuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk5iPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmJ9LApZaDpmdW5jdGlvbigpe3RoaXMuTmI9bnVsbH0sanE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLk5iJiYoYT0hMCk7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITApfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy52aWRlb1RhZztiJiZiLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkNrPSIzIjt0aGlzLmhkPTA7dGhpcy5ibj0zMDt0aGlzLmRjPVtdO3RoaXMub2I9W107dGhpcy55Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPQohMTt0aGlzLnN0YXR1cz10aGlzLmhkO3RoaXMuaWQ9Zi5WKDEwKTt0aGlzLkZmKGEpO3RoaXMuZm8oYil9LGY6ZnVuY3Rpb24oKXt9LGphOmZ1bmN0aW9uKCl7dGhpcy53aXx8KHRoaXMud2k9ITAsZi5qZigpKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlIoKTtRJiZRLnBjJiYhbWEmJihtYT0hMCxmLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLm1jKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5tYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKSxiPSEwLGU9bmV3IEk7d2luZG93W2UuZ2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0uaW5pdGlhdG9yIT1mLm1jKCkmJih0aGlzLkdmKCksYj0hMSk7cmV0dXJuIGJ9LEM6ZnVuY3Rpb24oYSxiKXt2YXIgZT0hMDthJiYoZT0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy54bSgpO2lmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5kYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5kYyYmMDx0aGlzLmRjLmxlbmd0aCYmCih0aGlzLmRjPWYudW5pcXVlKHRoaXMuZGMpLGYudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLmRjLmpvaW4oIiwiKSkpO2lmKHRoaXMub2Ipe2Zvcih2YXIgZT0wO2U8dGhpcy5vYi5sZW5ndGg7ZSsrKXRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPT10aGlzLnljW2FdJiZiLnB1c2godGhpcy5vYltlXS5kZXRhaWwpLHRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPHRoaXMueWNbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy55Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuQ2t9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZH0sb2c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLmtnfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5oZH0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihmKXtmLmZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPWEuUnA7Yj9iLnBhP2IucGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7dmFyIGE9ITEsZz0iIjtiLmdldEVycm9yJiYoYT1iLmdldEVycm9yKCkpO2F8fGIuZGV0YWlsLmdldEVycm9yJiYoYT1iLmRldGFpbC5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZSYmKGcrPWEuZ2V0RXJyb3JDb2RlKCkpO2EuZ2V0TWVzc2FnZSYmKGcrPWEuZ2V0TWVzc2FnZSgpKTtnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5nanx8cGE7KGZ1bmN0aW9uKGYpe2YuaGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuTGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkxqfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5uaD10aGlzLnhiPSExO3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YS5hdXRob3JpdHkmJmEuYXV0aG9yaXR5LmluZGV4T2YmJjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnRsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuOwphPXRoaXMudmlkZW9UYWcucGFyZW50Tm9kZS5wYXJlbnROb2RlfXRoaXMuVChhKX0sTGU6ZnVuY3Rpb24oKXtpZighdGhpcy54Yil7dmFyIGE9dGhpcy5OaCxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fCh0aGlzLnhiPSEwKTt0aGlzLlcoYil9fSxOYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmCjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe2IuZHVyYXRpb24mJmIucG9zaXRpb24mJjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LGxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTsKYi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5tZiYmKDAsdGhpcy5tZikoKX0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKCFhLmdldFN0YXRlfHwicGxheWluZyIhPWEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiYKYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxsYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGI9ITE7YS5nZXRWb2x1bWUmJmEuZ2V0Vm9sdW1lKCkmJihiPWEuZ2V0Vm9sdW1lKCkpO3JldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQWp8fHNhOyhmdW5jdGlvbihjKXtjLnpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuc2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLkhiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5IYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkhiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5IYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkhiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7Zm9yKHZhciBkPSJhZFBsYXkgYWRDb21wbGV0ZSBhZENsaWNrIGFkSW1wcmVzc2lvbiBhZE1ldGEgYWRTa2lwcGVkIGFkVGltZSIuc3BsaXQoIiAiKSxlPTA7ZTxkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuSGI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLmkoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChldmVudC5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpO2Eub24oInBsYXlsaXN0aXRlbSIsZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS50bD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTmI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/CnRoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnNlJiZ0aGlzLmkoKSl9LFltOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuS2U/dGhpcy5LZSsrOnRoaXMuS2U9MTp0aGlzLkplP3RoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy56anx8dGE7KGZ1bmN0aW9uKGMpe2MuQmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWWwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPQpbXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLnhifHx0aGlzLk0oZSl8fHRoaXMuRW0oZSl8fCh0aGlzLk4oZSksZT1uZXcgdGEoZSx0aGlzLkcpLGUuSigpLGUuZigpKX19dGhpcy5QKCl9fSxicTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxZbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQmp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkNsfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Yuc2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksCmE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFllOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5UYigxMCk7dGhpcy5WZj0hMDt0aGlzLkRjPXRoaXMudWg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmNsKCksdGhpcy56YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuRCgidC1vbmxpbmUuZGUiKT8KITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuSD9hLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYS5IJiZhLkguSWE/YS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkgmJmEuSC5JYT90eXBlb2YgYS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5wZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLAphLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5wYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueWU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9CnRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy50aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLlJuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkRjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkVjPSEwO2lmKGYuRCgiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmCmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5FY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxhcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGNsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0sCnpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkRjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGM/dGhpcy53KCk6KHRoaXMuZGEoITApLAp0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnVoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwKKGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGRsOmZ1bmN0aW9uKCl7dGhpcy5KY3x8KHRoaXMuSmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihhLmFkcyl7aWYodGhpcy5KYyE9YS5hZHMuc3RhdGUmJih0aGlzLkpjPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRsKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYKMTAwOT09dGhpcy5LKXJldHVybiEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl7dmFyIGE9ITE7Zi5UYygiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYil7Yj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVWwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fAoodGhpcy5WZj0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkModGhpcy5WZixmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbmw6ZnVuY3Rpb24oKXt0aGlzLmtxfHwoMTA8dGhpcy5ncD8odGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmdwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sWG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaHApe3RoaXMuaHA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMucmt8fHlhOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2VdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmCihhPWEucGxheWVyLnBsYXllcigpLGIucHVzaChhKSk7aWYoMDxmLlJlKGIpKXtmb3IodmFyIGUgaW4gYiliLmhhc093blByb3BlcnR5KGUpJiYoYT1uZXcgeGEoYltlXSksYS5oYXx8dGhpcy5NKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYSksKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLkFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5Bbnx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3RoaXMuc2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LEJuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTmIsZT10aGlzLmthKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLnBjJiYoMDw9ZS5pbmRleE9mKGQpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmCmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLlVqfHxSOyhmdW5jdGlvbihmKXtmLlRqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8KHRoaXMuUGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5QYisrLDE1PHRoaXMuUGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sCmVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmYihlLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCnRoaXMuSyk7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMuS2w9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5CbihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihmKXtmLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9CjE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPAphLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGU9bmV3IFIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgQ2EoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVmp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm1ufHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkRuPQphLnBvc2l0aW9uaW5nO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUud2lkdGg9YS53aWR0aDtlLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZS5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Uuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuRG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGUpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGIpfXRoaXMuVChlKTt0aGlzLlcoZSk7dGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLkNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DZCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1sOmZ1bmN0aW9uKCl7Zi56aCh0aGlzLkNkKTtmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTsKaWYoZi56aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLk0oYSkpKXt0aGlzLk4oYSk7KG5ldyBJYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Ibj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuSG58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSxNazpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5HaT0hMTt0aGlzLkxoPWQ7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmsmJmsuY2YodGhpcy5GYS51cmwpJiYhYyYmCihjb25zb2xlLmxvZygidGVzdDEiKSxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsInN0YXR1czAiLCEwKSk7ZyYmNCE9aC5yZWFkeVN0YXRlJiZnKGgpfS5iaW5kKHRoaXMpfWMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksayYmay5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTprLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLiRpPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxWbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYiwKYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17QXA6IkFkQ2xpY2tUaHJ1IixDcDoiQWRFcnJvciIsRHA6IkFkU3RvcHBlZCIsR3A6IkFkTGluZWFyQ2hhbmdlIixIcDoiQWRUYWdQYXJzZWQiLEtwOiJBZFZpZGVvQ29tcGxldGUiLE5wOiJBZExvYWRlZCIsT3A6IkFkU2tpcHBlZCIsUHA6IkFkU3RhcnRlZCIsRXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixGcDoiQWRJbXByZXNzaW9uIixCcDoiQWRDcmVhdGl2ZVZpZXciLElwOiJBZFZpZGVvTWlkcG9pbnQiLEpwOiJBZFBhdXNlZCIsTHA6IkFkVmlkZW9TdGFydCIsTXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5sZSxhW2RdKX0sVW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKCl7fSl9aWYodGhpcy5HYSYmdGhpcy5HYS5rZSlmb3IodmFyIGEgaW4gdGhpcy5HYS5rZSl0aGlzLkdhLmtlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuVm4oKTt0aGlzLkdhJiZ0aGlzLlVuKCl9fX0pKGMpO3ZhciBOYT1jLiRpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZmM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5XYj0iIjt0aGlzLmllPQoic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5iYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5YYj0iIjt0aGlzLlliPVtdO3RoaXMuWmI9W107dGhpcy5jZD1bXTt0aGlzLnVjPSIiO3RoaXMuSWI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm9jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMuRWI9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5GYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9CiExO3RoaXMuWmM9dGhpcy5QZD1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmZjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlFjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5XYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLApIT01BRF9BREJMT0NLRVI6dGhpcy5iYyx0ZXN0SGlkZTp0aGlzLlhiLHRlc3RUYWdzOnRoaXMuWWIsdGVzdFRhZ3NKUzp0aGlzLlpiLHRlc3RUYWdzWEhSOnRoaXMuY2QsdGVzdDNQQ29va2llOnRoaXMudWMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm9jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5FYixibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkZjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCwKYWRGYWxsYmFja0NvbmZpZzp0aGlzLmtkLHlpZWxkbGFiOnRoaXMuRGJ9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJgoodGhpcy5UZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUWM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuV2I9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5iYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuWGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYKKHRoaXMuWmI9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYodGhpcy5jZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudWM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm9jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLkViPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnNkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9CmIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLktmPWIuc2tpcEFsbG93ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxwbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09CiEwfSxabDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuV2soYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIiwKZj0iIixjPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuYmYoYik7Zj10aGlzLmFhKGIpO2c/KHRoaXMuU2MoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucmMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5mY3x8dGhpcy5xZCkmJihoPXRoaXMuZG4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5hbShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhkPWQuZXhlYyhiKSkmJihkWzJdfHxkWzVdKT9hPSEwOnRoaXMuU2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhiKSkmJmRbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFNjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYW06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihkIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2RdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuV3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxyYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYKKGE9ZC5mYWxsYmFjayk7cmV0dXJuIGF9LGNuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgbD1oW0JdLnNwbGl0KCI9Iik7Z1tsWzBdXT1sWzFdfWZvcih2YXIgayBpbiBhW2NdLnN1YnZhbHVlcylnW2tdPXRoaXMuSGgoZ1trXSxrLGFbY10uc3VidmFsdWVzW2tdKTtoPVtdO2ZvcihrIGluIGcpaC5wdXNoKGsrIj0iK2dba10pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9az1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWsucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sZG46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmZjJiYoYj10aGlzLmNuKGIsdGhpcy5mYykpO3JldHVybiBifSxsbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5mbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxmbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEua28oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmpvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxmLGMpe2s9dGhpczt0aGlzLmRmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1kO3RoaXMuY2U9Zzt0aGlzLmpjPWY7dGhpcy55YT1jfHx7fTt0aGlzLmxsKCk7dGhpcy5UbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlJtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5IYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkhjKCl9Y2F0Y2gobCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGQpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSx5bDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sVG06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUWMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMubm0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuSGMoKX0uYmluZCh0aGlzKSwhMCl9LFJtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlRiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChlKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmpjPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5qYz0hMSk7dGhpcy5qYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmpjP3RoaXMuamMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuTGMobC55bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbm06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5XYnx8dGhpcy5BYXx8dGhpcy5IYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxIYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5EKCJ3ZWIuZGUiKXx8Zi5EKCJnbXgubmV0Iil8fGYuRCgiZ214LmF0Iil8fGYuRCgiZ214LmNoIil8fGYuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLldiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5WZT1kLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLldiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucmMoKSksZD10aGlzLmFhKHRoaXMuV2IpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuV2IrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZT1hLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7aWYoIXRoaXMub2MmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm9jPSEwO3RoaXMuVWMoITApOwpyZXR1cm59fWU9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihlPSEwKX1jYXRjaChoKXt9aWYoIShlfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihkLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlhiPWQudGVzdGhpZGV8fCIiO3RoaXMuWmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5jZD1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudWM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5mYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZC5qc3BvcHVwc3x8ITE7dGhpcy5BYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkZjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWQueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1kLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm9jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5vYz0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLk9vKCkmJih0aGlzLlhifHx0aGlzLlpifHx0aGlzLllifHx0aGlzLmNkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuR28oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFhtOmZ1bmN0aW9uKGEpe3RoaXMuSGk9ITA7dmFyIGU9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZT10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZSkpLGU9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmUsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihlKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuVGModGhpcy5yYygpLCJQT1NUIixlLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBlPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztlPWUucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGUsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitlKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGUsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy5FYj0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0sRm86ZnVuY3Rpb24oKXtpZih0aGlzLlhiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5iYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuWGIpO2Uuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5YYik7ZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpOwphPWR9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKCkpLHRoaXMuS28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLlhkKHRoaXMuYmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5ZYj10aGlzLmNkKSYmdGhpcy5ZYi5sZW5ndGgpe3ZhciBkPXRoaXMuWWIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxLbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2YoKSYmZSgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZCgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5UYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGUuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBlKCl7dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlpiJiZ0aGlzLlpiLmxlbmd0aCl7dmFyIGQ9dGhpcy5aYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LExvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihlLGQpe2Q9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnVjKXRyeXtmLlRjKHRoaXMudWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSWI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixlPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLkViJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5ZaygpO3RoaXMudWMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5JYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLklifSl9LFlrOmZ1bmN0aW9uKCl7dGhpcy5aYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlpjLmlkPWYuVigxMCk7dGhpcy5aYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWmMpO3ZhciBhPXRoaXMuWmMuY29udGVudFdpbmRvdyxlPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5QZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxrbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucG0oKSl7dmFyIGE9dGhpcy5abCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGUsZCxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuR2k9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGdsOmZ1bmN0aW9uKCl7dGhpcy4kbXx8KHRoaXMuJG09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoZz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5TYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChlKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChlKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSxFbzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30saWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuJG8uYmluZCh0aGlzKSx0aGlzLlpvLmJpbmQodGhpcykpfSwkbzpmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbDt0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuSmwoKX0sWm86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5MYyhsLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuQWJbYV07InJlcXVlc3QiPT1lLnR5cGUmJmYuZWIoZS51cmwsZS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1lLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmdhKCldPXRoaXM7Zi5lYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxUYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPQoiIixkPTA7ZDxhO2QrKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZX0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPSIiLGQsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGV9LGFhOmZ1bmN0aW9uKGEpe3ZhciBlPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2VbZ11dPWFbZ118fCIiO2QucXVlcnlLZXk9e307ZFtlWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGUpe2ImJihkLnF1ZXJ5S2V5W2JdPWUpfSk7cmV0dXJuIGR9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9IiIsZSxkO2ZvcihlPTc7MDw9ZTtlLS0pZD1hPj4+NCplJjE1LGIrPWQudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChuJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGYsNSkrKG4mcHx+biZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWQoZiw1KSsobl5wXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1kKGYsNSkrKG4mcHxuJnJ8cCZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZChmLDUpKyhuXnBecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2Esaz1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Daj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuQ2p8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMua2M9dGhpcy5yZD0hMTt0aGlzLlVrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuWGs9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5vZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Taz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlhjPXRoaXMuVGQ9ITE7dGhpcy5GaD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLnBjPSExO3RoaXMudmw9Zi5WKDEwKTt0aGlzLlNiPWYuVigxMCk7dGhpcy5RYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy5hYz10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMueGM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Qbz10aGlzLkdiPXRoaXMuUmI9ITE7dGhpcy5CYz1bXTt0aGlzLnFjPXt9O3RoaXMudm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkdjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGU9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZX0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuT2ImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLndvKCk7Zi5vKGwuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxlLGQsZyl7dGhpcy5HYj0KZDt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5rbCgpLGc9ay5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLmFvKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZSxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZSxkKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy5hYz10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5xbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5CYz10aGlzLmFoKGEpO3RoaXMub2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMuam0oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGU9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZT10aGlzLmFoKGIucGFyZW50KSksZS5wdXNoKHRoaXMuVGwoYikpKTtyZXR1cm4gZX0sVGw6ZnVuY3Rpb24oYSl7dmFyIGU9IiIsZD1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2U9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylkLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDplLGNyZWF0aXZlSUQ6ZH19LGptOmZ1bmN0aW9uKGEpe3ZhciBlPVtdLGQ9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGUubGVuZ3RoO2grKylkLnB1c2goYS51YihlW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZT0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGU9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZT1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTplPT1GLm1lLmNvZGU/Zi5vKGwudXAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGU9PUYuaGcuY29kZSYmZi5vKGwuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGwuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnhvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSWImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5JYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhsLmFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8obC52cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhsLndwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8obC5obix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8obC5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8obC5Zbyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMubGMoYSk7dGhpcy5SYSgpfSxsYzpmdW5jdGlvbihhKXt2YXIgZT05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZT1hLmVycm9yLmNvZGUsOTAxPGUmJihlPTkwMCkpO2ZvcihlPXsiW0VSUk9SQ09ERV0iOmV9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLmdmKGQudXJsLGQudHlwZSxlKX1jYXRjaChnKXt9fSxxbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBlPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGU9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1lO2U9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2QmJmQuZW52dmFycyYmKGc9ZC5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRmQmJihnPWQuRmQoKSk7Zy52aWRlb1Nsb3QmJihlPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31lLnZxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihlLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZS5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZS5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5TayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGUudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZS5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZSxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLndmJiZlLmxvYWQoKTtpZih0aGlzLm1pKGUpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGUpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWU6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpfWNhdGNoKGspe3RoaXMudmlkZW89CmV9fWVsc2UgdGhpcy5iLnJsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxvbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnhjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGwuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlJrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVmIoIm11dGVkIiwiY29udGVudCIpO2YubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRix0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5tbSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGsuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRiwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8obC5JYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5uYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5CYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmpwKCksdGhpcy5hLm5jKCEwKSwhdGhpcy5hYykpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5hYz17ZWw6dGhpcy5GLGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8obC5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubmMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5uYyghMCksdGhpcy5ycCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5wcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm9wKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhsLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5GY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMua3AoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnRjKCkpLHRoaXMubHAoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlZiKCJtdXRlZCIsInVzZXIiKSxmLm8obC5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVmIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGwuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGwudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkYsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxrcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnhjPSEwfSxscDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54Yz0hMX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8obC51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8obC50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHBwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhsLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sb3A6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGU9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7Zi5EZSgpO3RoaXMuRj0hMTt0aGlzLlJhKGEpfX0saXA6ZnVuY3Rpb24oYSl7dmFyIGU9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZSYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZT1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZS5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhsLnRwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApOazpmdW5jdGlvbihhLGUpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuU2MoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZChlLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuZnAuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChlLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmtjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2N8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuVWspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlJiJiYhdGhpcy5rYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUmJ8fCh0aGlzLlJiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGUpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuY3AoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuYnAoKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLnZpZGVvLnBsYXkoKTtpZihlJiZlWyJjYXRjaCJdKWVbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5zYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnNjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8obC5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPVtdLGQ9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWQ9Zi5maChhW2ddKSxlLnB1c2goZCk7YT17aGFzaGVzOmV9O2E9bC5UYShhLHRoaXMudSgpKTtmLnVvKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Layh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhsLmxuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkZifHx0aGlzLmIuemMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmtjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZSl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5wYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRmImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIuemMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSxmcDpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmtjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5nbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5wYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhsLkljLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlNvKGEpO2lmKCF0aGlzLmFjKXt2YXIgZT0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuYWM9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhsLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmUscGVyY2VudDpkLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX1kPSIiO3RoaXMuYi5MZiYmKGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuTGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhsLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkZiPyh0aGlzLmtjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxlLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFNvOmZ1bmN0aW9uKGEpe2YubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5SYnx8KDA9PWEmJih0aGlzLkdiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLkdiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5JYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSWIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5SYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGwudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8obC5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGUpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZSwhMCl9LHdvOmZ1bmN0aW9uKCl7Zi52YyhbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YudmMoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtmLnZjKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi52YyhbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFZiOmZ1bmN0aW9uKGEsZSl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZSwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZSl7aWYoIXRoaXMuUmIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5rbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGM9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkdjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGwuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZSl0cnl7dGhpcy5iLlBhPXRoaXMuemwodGhpcy5iLlBhLGEpfWNhdGNoKGspe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZT0iIjt0aGlzLmNnJiYoZT0iX3ZwYWlkIik7dGhpcy5kZCYmKGU9Il93ZWxlY3QiKTtyZXR1cm4gYStlfSxnZjpmdW5jdGlvbihhLGUsZCxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihlPXRoaXMuQS53YShhKSxkJiZlLk1rKGQpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuT2soYSksdGhpcy5BLkxhKGUsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE9rOmZ1bmN0aW9uKGEpe3RoaXMucWNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5xY1thXT0iY2xvc2VkIn0sb2w6ZnVuY3Rpb24oKXt0aGlzLnFjPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZTtmb3IoZSBpbiB0aGlzLnFjKXRoaXMucWMuaGFzT3duUHJvcGVydHkoZSkmJiJvcGVuIj09dGhpcy5xY1tlXSYmYSsrO3JldHVybiBhfSxrbTpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1lfSl9LHpsOmZ1bmN0aW9uKGEsZSl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1lfSl9LGNwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy50YygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGUpe31mLm8obC5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRmN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZSl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxicDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBlPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGU9dGhpcy5BLnRkKTtlJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLktiLmJpbmQodGhpcyksMUUzKmUpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sS2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMudmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuU2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlFiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Sby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5MYigpO3RoaXMuS2IoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZkLmFwcGVuZENoaWxkKGgpO2QuYXBwZW5kQ2hpbGQoYyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuTGIoKTt0aGlzLktiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUud2lkdGg9IjEwMCUiLGUuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGUuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGUuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLAplLnN0eWxlLmJvdHRvbT0iMHB4IixlLnN0eWxlLnpJbmRleD0iMTAwMDAiLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmUuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGUpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhsLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLkxiKCl9fSxMYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHRjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlNiKTt0aGlzLnhjPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMueGM9ITEpOihmLm1hKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy54Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGwucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwidXNlciIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVmIoIm11dGVkIiwidXNlciIpLGYubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5WYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGwuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5RYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxzYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5zYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEuRWJ8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuT2ImJnRoaXMuVG8oKXx8KHRoaXMueWQ9ITAsdGhpcy5HYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5HYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGU9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixkPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZStkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZT1rLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGN8fChhPQohMCxlLmFkRmFsbGJhY2tVUkx8fChlLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkdjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuR2M/ImFueSI6IiIpKyhlLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5YYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuR2MmJmUuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhjfSwkbDpmdW5jdGlvbigpe3ZhciBhPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxlPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1lLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZS5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmUuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBlPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuJGwoKTt0aGlzLkdjPXRoaXMuWGM9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBlPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2UsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy52bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlpuKCksdGhpcy5wYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhsLnVsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5GYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5CYyYmMDx0aGlzLkJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5CYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5YaysiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5Fa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtlPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy5BYz10aGlzLkNjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGUsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGU9IiI7Yi5xdWVyeUtleSYmKGU9Yi5xdWVyeUtleS5odnApO2UmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmsud2Eoay5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihmLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuRCgiZmFuZG9tLmNvbSIpfHxmLkQoImdpZ2EuZGUiKXx8Zi5EKCJraW5vLmRlIil8fGYuRCgic3BpZWxldGlwcHMuZGUiKXx8Zi5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuRCgiZ2lnYS5kZSIpfHxmLkQoImtpbm8uZGUiKXx8Zi5EKCJzcGllbGV0aXBwcy5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxsKCl8fG0oKXx8ImFwcHNwb3QiPT1lKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChrLldkKGgpKSsiJnR5cGU9anMiLGI9ay53YShrLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9ay53YShrLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9ay5MYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixlKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk9iKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtlW2JdPXt9fWVsc2UgZS5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBlPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5PYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuT2J8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGsuRW8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZDtlLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWUucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZSk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxlPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1lPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkpuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5XYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGUpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuV2MoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFdjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxlLHtBZFN5c3RlbTp0aGlzLlNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlZvKCkmJnRoaXMudGYodGhpcy54bCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5DYz8odGhpcy5DYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuV2MoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLkFjPyh0aGlzLkFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLldjKCkpOnRoaXMucGFyZW50LkloKCl9LFZvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLk5jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRmI9YS5GYj9hLkZiOnRoaXMuQ2M7YS56Yz1hLnpjP2EuemM6dGhpcy5BYzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3RoaXMucGFyZW50LnRmKGEpfSx4bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk5jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuVmwoKTthLkNxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUmwoKTthLkxmPXRoaXMuaW0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZT0hMTsoZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZlLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLldsKCkpOmEuUGEuY29uY2F0KHRoaXMuZW0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5sYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmxjJiZ0aGlzLnBhcmVudC5sYyhhKSxiPTAsdGhpcy5XYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxsYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5sYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGU9bmV3IFRhKGEsYik7ZS5vcmlnaW49dGhpcztyZXR1cm4gZX0sTW86ZnVuY3Rpb24oKXtyZXR1cm4gYjxlfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5OYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxKbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZSl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFNsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGQ9YVtlXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZCYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZSl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspYi5wdXNoKHtpZDphW2VdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZV0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtlXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2VdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZV0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxYcDphW2VdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2VdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxSbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZT0hMSxkPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZT1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2U9Yn1kLnB1c2goZSk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZCxoPWMpOihiPWUsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGltOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGU9ITEsZD0hMTt0cnl7ZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9ZS5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYudG8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5hbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMuemM9dGhpcy5GYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLldqPWE7YS5wcm90b3R5cGU9e3JsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTy5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGNtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGU9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShlPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZS5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2RdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmNtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxtbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk8ubGVuZ3RoO2UrKylpZigwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tlXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuV2p8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMubWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0seHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx5cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLk9tfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWU7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Eanx8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1lO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuZXA9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnpwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy5aaFthXSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ycT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Xbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Qbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzpkLGZyYW1lOmYsd246Yyx2ZW5kb3I6ZS5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMucWYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy5xZltlXTtkLnR5cGU9PT1hJiZkLiRrKHRoaXMuWGwoYSkpfX0sWGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7QXE6ITAsenE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7b3E6InZpZGVvIixEcToianNDdXN0b20iLEVxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRnE6MSxZcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxsbTpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMuYmUubGVuZ3RoO2UrKylpZih0aGlzLmJlW2VdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZV0ud247cmV0dXJuIiJ9LFduOmZ1bmN0aW9uKGEsZSl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5sbShlKSx2ZW5kb3I6ZX0pO3RoaXMudm8oKX0sUG46ZnVuY3Rpb24oYSxlKXsidmlkZW8iPT09YT90aGlzLmVwLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZSl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxlKX0semc6ZnVuY3Rpb24oYSxlKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKJGs6ZSx4cTohMX0pfSx2bzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLnFxKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkJxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLnNtfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuY29uZj1lfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5nYz1bXX1jLmFqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBlPXt9LGQ9ITEsYz0wLGU9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixjPWUubGVmdCxlPWUudG9wKTtmPXt4OmMseTplfTtmLnBvc2l0aW9uPWQ7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBlPTAsZD0wLGM9ITEsZj10aGlzLnVtKGEpLGg9e307YTspZSs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGUrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZSx5OmR9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSxDbzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8obC5JYyx0aGlzLmMubCgpKX0sWm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8obC53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy4kYyYmdGhpcy5jLiRjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxlJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxObDpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmdldFBvc2l0aW9uKGEpO2UucG9zaXRpb24/ZS5wb3NpdGlvbj1lLnBvc2l0aW9uOmUucG9zaXRpb249ImFic29sdXRlIjtlLndpZHRoPWEub2Zmc2V0V2lkdGg7ZS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGV9LG5jOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuTmwodGhpcy50Yik7aWYoZS54IT10aGlzLkhhLnh8fGUueSE9dGhpcy5IYS55fHxlLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxlLndpZHRoIT10aGlzLkhhLndpZHRofHxlLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZS53aWR0aCYmMD09ZS5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1lO3RoaXMuYy4kYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmUueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZS55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1lLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdGhpcy5nY1thXSh7d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5nYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5hanx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMudW58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1lKWEuY29udGFpbmVySWQ9ZS5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Qaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmVjPXRoaXMuZWN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTmI7YSYmYS5wYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZWMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZT0wO2U8Yi5tb2R1bGVzLmxlbmd0aDtlKyspe3ZhciBkPWIubW9kdWxlc1tlXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuVnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5tcSgpOiExfSxOYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTmMoKTotMX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5lYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmVjfHwzMDI9PXRoaXMuZWM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZWMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5mbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Qanx8Y2I7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy4kai5Eay5Caz93aW5kb3cuT08uJGouRGsuQmsuVHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IGNiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlJqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMucW58fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlNpfHxnYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZT1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxlPWEuZGF0YS5tZXNzYWdlKTtmLkQoIndlbHQuZGUiKSYmIXRoaXMuc24mJih0aGlzLnNuPSEwLGYuRWkoYikpOzEyMDUhPWImJig5MDA9PWImJjA8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRWcoYS5hZEVycm9yRXZlbnRzKTsKYS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe2YuRCgid2VsdC5kZSIpJiYhdGhpcy5ybiYmKHRoaXMucm49ITAsZi5GaSgpKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaGI9Yy5SaXx8aGI7KGZ1bmN0aW9uKGMpe2MuVGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxVaDpmdW5jdGlvbihhKXthPW5ldyBnYihhKTthLmhhP3RoaXMuUCgpOnRoaXMuTShhKXx8KGEuUWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLk4oYSksKG5ldyBoYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1sfHwodGhpcy5NbD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuVWgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlVoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgaWI9Yy5UaXx8aWIsVD1uZXcgaWIodCk7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgamI9Yy5RbHx8amI7bmV3IGpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmtrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYSl7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGEpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ra3x8VTsoZnVuY3Rpb24oYyl7Yy5qaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3Lm5kKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLnBuKGEpfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpOwp3Lm5kKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5vbSgpfSxwbjpmdW5jdGlvbihhKXt2YXIgYj0iIixlO2ZvcihlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSl7Yj1pc05hTihhW2VdKT8hMTphW2VdO2lmKDEwMDk9PWFbZV18fDEwMDE9PWFbZV18fDMwMz09YVtlXXx8NDAzPT1hW2VdKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2VdKWlmKGFbZV0uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbZV1bZF0pPyExOmFbZV1bZF0sMTAwOT09YVtlXVtkXXx8MTAwMT09YVtlXVtkXXx8MzAzPT1hW2VdW2RdfHw0MDM9PWFbZV1bZF0pKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufX10aGlzLm0oImFkZXJyb3IiLGIpO3RoaXMuQygpfX0pfSkoYyk7dmFyIFY9Yy5qa3x8VjsoZnVuY3Rpb24oYyl7Yy5saz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO3RoaXMuTGQmJihhPWYuQWwoYSx0aGlzLkxkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTShkKSl7dGhpcy5OKGQpO3ZhciBjPW5ldyBWKGQsdGhpcy5HKTtjLmYoKX19Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IoZT1hW2JdO2UucGFyZW50RWxlbWVudDspe3ZhciBlPWUucGFyZW50RWxlbWVudCxoPWUuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5MZHx8Cih0aGlzLkxkPVtdKSx0aGlzLkxkLnB1c2goYVtiXSksZD1uZXcgVShoKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksYz1uZXcgVihkLHRoaXMuRyksYy5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxuZDpmdW5jdGlvbihhLGIsZSl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYV18fCh0aGlzLmNhW2FdPXt9KTt0aGlzLmNhW2FdW2JdfHwodGhpcy5jYVthXVtiXT1bXSk7dGhpcy5jYVthXVtiXS5wdXNoKGUpfSxObzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVtiXSl0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGEpLHRoaXMuWW4oKSYmKHRoaXMuemYoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgZT0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihlPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtiXVtlXSYmMDx0aGlzLmNhW2JdW2VdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2JdW2VdLmxlbmd0aDtkKyspdGhpcy5jYVtiXVtlXVtkXShhKX19LG9tOmZ1bmN0aW9uKCl7aWYodGhpcy5WYylmb3IodmFyIGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5WY1thXSxlPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbZV1bZF0mJjA8dGhpcy5jYVtlXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmNhW2VdW2RdLmxlbmd0aDtjKyspdGhpcy5jYVtlXVtkXVtjXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1hLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9YS5vRXZlbnRUeXBlLmgmJncuTm8oYSl9fSl9KShjKTt2YXIga2I9Yy5sa3x8a2Isdz1uZXcga2IodCk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5FbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBsYXkoKX0pfSwKdWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLk9pfHxtYjsoZnVuY3Rpb24oYyl7Yy5QaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIithKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5QaXx8bmI7KGZ1bmN0aW9uKGMpe2MuUWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYSYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT0KYVtiXSxkPSIiO3RyeXtkPWUuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGMpe2Q9ZS5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgbWIoZCk7dGhpcy5NKGYpfHwodGhpcy5OKGYpLChuZXcgbmIoZix0aGlzLkcpKS5mKCkpfWNhdGNoKGgpe319dGhpcy5QKCl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGUgaW4gdGhpcy5NYSlpZihiPT10aGlzLk1hW2VdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5RaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFiPWMuem58fHFiO25ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy5wbHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSksdGhpcy5wbD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSmcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz1hLnNvdXJjZS5DSE9PU0VSX0FCfHwiIixoPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYywhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9pbnRlcmFjdGlvbiIsCmMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLkpnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuTm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmljfHwodGhpcy5pYz1bXSk7dGhpcy5pYy5wdXNoKGEpfSxxbDpmdW5jdGlvbigpe2lmKHRoaXMuaWMmJnRoaXMuaWMubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5pYy5sZW5ndGg7YSsrKXRyeXt0aGlzLmljW2FdKCl9Y2F0Y2goYil7fX0sRmQ6ZnVuY3Rpb24oKXtpZih0aGlzLktjKXJldHVybiB0aGlzLktjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE5uOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuTmp8fHJiOyhmdW5jdGlvbihjKXtjLk1qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5EaT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMuRGkmJih0aGlzLmkoKSx0aGlzLkRpPSEwLHRoaXMubmEoKSk7Yi5VYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSWV8fCh0aGlzLkllPTEpLHRoaXMuSWUrKywxMDA8dGhpcy5JZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTWp8fHNiOyhmdW5jdGlvbihjKXtjLk9qPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7Zi50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgZT0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspZT0KbmV3IHJiKGFbZF0pLHRoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IHNiKGUsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciB0Yj1jLk9qfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlRrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdmI9Yy52a3x8dmI7KGZ1bmN0aW9uKGMpe2MudWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LExuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMuRGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuTG4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuRGMpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5oYltiXSYmMzAzIT10aGlzLmhiW2JdJiY0MDMhPXRoaXMuaGJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLmphKCk7CmVsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy51a3x8d2I7KGZ1bmN0aW9uKGMpe2Mud2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBlPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuTShlKXx8LTE9PWUuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihlKSwobmV3IHdiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB4Yj1jLndrfHx4Yix5Yj1uZXcgeGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgemI9Yy5HbHx8emI7bmV3IHpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmRrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnVmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5DbigpfS5iaW5kKHRoaXMpLDUwMCl9LENuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnVmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LHlvOmZ1bmN0aW9uKCl7dGhpcy51Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuZGt8fEFiOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5abT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMud2N8fCh0aGlzLndjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLndjfHx0aGlzLndjKyssdGhpcy53Yzw9dGhpcy5abT8odGhpcy53YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkueW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuY2t8fEJiOyhmdW5jdGlvbihjKXtjLmVrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBCYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIENiPWMuZWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkZsfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5iaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE5hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5ia3x8RmI7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVWEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5RbSgpOnRoaXMuR2coKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxzbDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sUW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpiKCk7IWEucGEmJmEuWSYmYS5TcCYmYS5VcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEdnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgZTthOnthPWEuZ2V0RXJyb3IoKTtmb3IoZSBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtlXSl7ZT1hW2VdO2JyZWFrIGF9ZT12b2lkIDB9MTAwOT09ZXx8MzAzPT1lfHw0MDM9PQplPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGUpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5KYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5VYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sbnE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSmIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuYWt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0samw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IEdiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLmpsKGFbYl0pO3RoaXMuUCgpfX0pO2MuZ2QuSmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBkPQpiW2VdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0mJmJbZV0uZmVybW9kJiZhLnB1c2goYltlXS5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy52anx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sJGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVWE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLkpqfHxYOyhmdW5jdGlvbihjKXtjLklqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnZmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMudmY9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGU9YS5wbGF5ZXJDb250YWluZXI7ZSYmdGhpcy52ZiYmZSE9dGhpcy52Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLkQoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLnNxKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSWp8fFk7KGZ1bmN0aW9uKGMpe2MuS2o9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLAplPWIubGVuZ3RoLGQ9MDtkPGU7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLnpmKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBHLEtiPWMuS2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5ZaXx8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubWo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxlPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksZT1hLkdldEVsKCksYiYmZT8odGhpcy5UKGUpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5tanx8TmI7KGZ1bmN0aW9uKGMpe2MubGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxCZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksZT0wO2U8Yi5sZW5ndGg7ZSsrKXRoaXMuaGFuZGxlRXJyb3IoYltlXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLmxqfHxPYjsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgTmIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgT2IoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFBiPWMubmp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmJqfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGU9ITE7YT8oZT1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZlPyh0aGlzLlQoZSksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuVml8fFNiOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy5XaXx8VGI7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGU9bmV3IFNiKGFbYl0pO2UuaGF8fHRoaXMuTShlKXx8KHRoaXMuTihlKSx3aW5kb3cuYnJpZHBsYXllcj1lLChuZXcgVGIoZSx0aGlzLkcpKS5mKCkpfX10aGlzLlAoKX19KX0pKGMpO3ZhciBVYj1jLlhpfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMubm58fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSwkZDpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LE1uOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuemt8fFhiOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmhjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0saGM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkdrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuR2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmhjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuUW4oKX0sUW46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5Lbj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5Lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmhjKGEpKX19KX0pKGMpO3ZhciBZYj1jLnlrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhLk1uKCksYT1uZXcgWWIoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMuQWt8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5kanx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2V8fChlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtlPyh0aGlzLlcoZSksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5lbj1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW59LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlpkKGEpfS5iaW5kKHRoaXMpKX0sWmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5va3x8TjsoZnVuY3Rpb24oYyl7Yy5uaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8Cih0aGlzLlBiPTApLHRoaXMuUGIrKywxNTx0aGlzLlBiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLm1vKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5LPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT0KYS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSYmYVtjXSYmYVtjXS5hZEVycm9yJiZhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMubmt8fE87KGZ1bmN0aW9uKGMpe2MucGs9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuemYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBiYz1jLnBrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5janx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ganx8WjsoZnVuY3Rpb24oYyl7Yy5Faj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuVGIoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy56YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx6YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRWp8fGFhOyhmdW5jdGlvbihjKXtjLkdqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGVjPWMuR2p8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLlBtfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLmpqfHxoYzsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5GZygpfSxGZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMuaWp8fAppYzsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuUCgpO3JldHVybn1pZighdGhpcy5NKGEpKXt0aGlzLk4oYSk7KG5ldyBpYyhhLHRoaXMuRykpLmYoKTt0aGlzLlAoKTtyZXR1cm59fXRoaXMuUCgpfX0pfSkoYyk7dmFyIGpjPWMua2p8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLkJsfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLkppfHxtYzsoZnVuY3Rpb24oYyl7Yy5JaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5BZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5BZS5iaW5kKHRoaXMpLDEwMCl9LEFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5JaXx8bmM7KGZ1bmN0aW9uKGMpe2MuS2k9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxUYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLlAoKTp0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBuYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5QKCl9fSl9KShjKTt2YXIgb2M9Yy5LaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuaGt8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5OZD1bXTt0aGlzLnlmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5Zaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmdtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnlmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy55ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5OZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxnbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy55ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxBbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV0uJGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5OZFthXS4kYil9fX0pKGMpO3ZhciByYz0KYy5Zanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy50bnx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGwuV28pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGwuam4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTWUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5EbHx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLk1iPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi53YigibmV3QWRkZWxpdmVyeSIpfWMuTGk9YTthLnByb3RvdHlwZT17aW86ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApjbzpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LGJvOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LGFkOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnptKCkpdGhpcy5NYi5nKHRoaXMuTWIuUWMsdGhpcy5NYi5xYSx0aGlzLk1iLnhmLGZ1bmN0aW9uKCl7dGhpcy5hZChhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTWIuamMpO2Vsc2UgaWYoay5EYiYmIWsuSGkpay5YbShmdW5jdGlvbigpe3RoaXMuYWQoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhsLkljLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5DbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLndiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTWIsaCk7bS4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmZmJiYoZD10aGlzLnBsYXllci5mZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5oZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx6bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LHNvOmZ1bmN0aW9uKCl7Zi53YigicHJlcm9sbCIpO2YuRWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuYWQoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX0scm86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRWYoInBvc3Ryb2xsIik7Zi53YigicG9zdHJvbGwiKTt0aGlzLmlvKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLmFkKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxUbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBvKHRoaXMucm8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sU2Q6ZnVuY3Rpb24oYSl7Zi53YigibWlkcm9sbCIpO2YuRWYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5hZChjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8obC53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxTbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmhvKHRoaXMuU2QuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGYoKX0sZjpmdW5jdGlvbigpe3RoaXMuc28oKTt0aGlzLnBsYXllci5sZiYmdGhpcy5TbigpO3RoaXMuVG4oKX19fSkoYyk7dmFyIGZhPWMuTGl8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy5pa3x8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFBoZVhhaWtpY2h1eGFUYWgsUGhlWGFpa2ljaHV4YVRhaCk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.225.73.19
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-13-225-73-19.fra2.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.giga.de/999647047575ea861c57e02e5480542569499f0f/
Frame E10D
|
807 B
2 KB
|
1474ms
85ms
|
XHR
application/json |
148.251.51.163
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.giga.de/999647047575ea861c57e02e5480542569499f0f/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFBoZVhhaWtpY2h1eGFUYWg9UGhlWGFpa2ljaHV4YVRhaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnhuKWsueWwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsayl9KX1rLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5aaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmspeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8obC5JYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9rLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5jbyhrKTtiLmJvKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGsuQWIubGVuZ3RoKXt2YXIgYj1rLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmxvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09aztmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxrKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5aaz0hMTt0aGlzLk9iPSJzZXR1cCI7dGhpcy5iZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRm4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxtYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxGbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5FbihiLmRhdGEpfSxFbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5UYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuT2woYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy53bChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxhbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sd2w6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGY9YltxXS5zcGxpdCgiOiIpLApkPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGY9ZC5zcGxpdCgiLSIpLGQ9ZlswXSt0aGlzLmFsKGZbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscT0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtxPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHEmJihmPTEwMC9xKmQqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFRiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZT0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZSs9Zy50b1N0cmluZygxNik7cmV0dXJuIGV9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHEsZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsbD0yNzE3MzM4Nzgsaz0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcT1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO3E9YztuPWg7bT16O3k9bDt0PWs7Zm9yKGc9MDsxOT49ZztnKyspcD1kKHEsNSkrKG4mbXx+biZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9MjA7Mzk+PWc7ZysrKXA9ZChxLDUpKyhuXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTQwOzU5Pj1nO2crKylwPWQocSw1KSsobiZtfG4meXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz02MDs3OT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Yz1jK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cmw9bCt5JjQyOTQ5NjcyOTU7az1rK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShsKSthKGspKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHEsZixjLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxxPWIuY2hhckNvZGVBdCh6KyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8cT4+NixoPXEmNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKHEpJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxobDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHE9ITEsZj0hMSxjPSExLGg9ITEsej0hMSxsPSExLGs9ITE7dHJ5e2E9dGhpcy5obCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZ2M/ITA6ITF9Y2F0Y2godCl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxrPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1xO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1sO2IuaXNCbGluaz1rO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17Tmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sU2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxWazpmdW5jdGlvbigpe3JldHVybiBiLk5pKCl8fApiLlVpKCl8fGIud20oKXx8Yi5TaigpfHxiLnhrKCl8fGIuSGooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuVmsoKX0sVWw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGUpe2EmJihkLnF1ZXJ5S2V5W2FdPQplKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxobTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuT2I9Yn0sTWU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5PYjt0aGlzLnVlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnhuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5NZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1sLlRhKGEsZCkpO2EmJih4PWwuVGEoYixhKSk7ZyYmKHg9bC5UYSh4LGcpKTtxJiYoeD1sLlRhKHgscSkpO2MmJih4PWwuVGEoeCxjKSk7aCYmKHg9bC5UYSh4LGMpKTtmLkxjKHgpfSxHbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmhtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5tYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuR24oYik7aWYoYSlpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWsucmMoKTtrLndhKGIsITApO2I9ay53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtrLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFrfHwhay5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihrLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9ay5yYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7ay53YShnLCEwKTtnPWsud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ay5MYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSx2YzpmdW5jdGlvbihiKXtpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmMoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWsucmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9ay53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtrLkxhKGQpfX0samY6ZnVuY3Rpb24oKXtrJiZrLlM/ay5pc0VuYWJsZWQmJmsuaWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihmWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBjPSExO2Q9ITE7ZD10aGlzLmViKGIsYS5BYSxmLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9CiExfWMudXJsJiZjLmhhc2gmJihjPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuUGsoYyxiKTtyZXR1cm4gY30sZWI6ZnVuY3Rpb24oYixhLGQsZyxmLGMsaCx4KXt2YXIgbD1jfHxrO2M9ITA7eCYmKGM9ITEpO2lmKGwmJmwuUylpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2wud2EoYixjKTtjPWwud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWMuZGF0YVt0XT1kW3RdO3JldHVybiBsLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZCxnLGYsbCxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFRjOmZ1bmN0aW9uKGIsYSxkLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGwgaW4gaClkKz0iJiIrbCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbbF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGs9bmV3IFhNTEh0dHBSZXF1ZXN0O2sub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWsucmVhZHlTdGF0ZXx8MjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1c3x8ZyhrKTtmJiY0PT1rLnJlYWR5U3RhdGUmJjIwMCE9ay5zdGF0dXMmJjIwMSE9ay5zdGF0dXMmJmYoayl9O3RyeXtrLm9wZW4oYSxiLHgpLGsud2l0aENyZWRlbnRpYWxzPWMsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBrfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5UYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYmQpZm9yKHZhciBjIGluIHRoaXMuYmQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5iZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlVtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmJkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsZil7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxXazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxGaTpmdW5jdGlvbigpe2smJmsuUz9mLnRyYWNrKCJzdGF0c19oZF9wbGF5aW5nX3N1bSIsay5FYiwhMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZpKCl9LmJpbmQodGhpcyksNTAwKX0sRWk6ZnVuY3Rpb24oYil7ayYmay5TP2suRWImJmYudmMoWyJzdGF0c19oZF9lcnJvcmNvZGU6IitiLCJzdGF0c19oZF9lcnJvcmNvZGVfc3VtIl0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FaShiKX0uYmluZCh0aGlzKSw1MDApfX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPQpiW2ddO3JldHVybiBkfTthLnluPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTthLmhuPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVwPXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIiwKbmFtZToiYWRNaWRQb2ludCJ9O2Eudmc9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTthLkhrPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTthLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuYXA9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS52cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2EuS2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07YS51bD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2Eud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5JYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9OwphLnJlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTthLnRlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07YS5Jaz17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5sbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudHA9Cntjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlhvPXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGw9Yy5wanx8bDtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYudm09YTthLnByb3RvdHlwZT0Ke319KShjKTt2YXIgamE9Yy52bXx8amE7bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5yaj1hO2EucHJvdG90eXBlPXtUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZyxmO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoZj1iLmxlbmd0aDtkPGY7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxkbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrCiIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLkVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfSx5bTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhKCkrIjIifSx4aDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLlRlKHRoaXMuZG0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fQp2YXIgYj0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87YS5leHRlbmQ9ZnVuY3Rpb24oZSl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZz1PYmplY3QuY3JlYXRlKGQpLGY7Zm9yKGYgaW4gZSlnW2ZdPSJmdW5jdGlvbiI9PT10eXBlb2YgZVtmXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbZl0mJmIudGVzdChlW2ZdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGYsZVtmXSk6ZVtmXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2YuWmk9YX0pKGMpO3ZhciBLPWMuWml8fApLO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxhPWMuRmt8fGxhO25ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5NYT17fTt0aGlzLkc9bnVsbDt0aGlzLlljPTEwMDt0aGlzLlViPTA7dGhpcy5WYT0xNTA7dGhpcy4kYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlViPD10aGlzLlZhPyh0aGlzLlViKyssdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSk6MD50aGlzLlZhJiYodGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSl9LFluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWI+CnRoaXMuVmE/ITA6ITF9LHpmOmZ1bmN0aW9uKCl7dGhpcy5VYj0wfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sZW86ZnVuY3Rpb24oYSl7dGhpcy5HPWF9LGJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sTjpmdW5jdGlvbihhKXt0aGlzLk1hW2Eua2EoKV09YTtMJiZMLkRoJiZMLkFvKGEpfSxmcTpmdW5jdGlvbigpe3JldHVybiBmLlJlKHRoaXMuTWEpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9CnRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLlljPTEwO3RoaXMuVWI9MDt0aGlzLlZhPTUwO3RoaXMuWD1udWxsO3RoaXMuaGE9ITE7dGhpcy5wbGF5ZXI9YTt0aGlzLk5iPSIiO3RoaXMuUWc9ITE7dGhpcy5KKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGdxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0saG86ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSxlcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVWI8PQp0aGlzLlZhJiYodGhpcy5VYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLHRoaXMuWWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuaWQ9YX0seXE6ZnVuY3Rpb24oKXt9LFc6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1hO3RoaXMucW0oKXx8dGhpcy5MaygpO3RoaXMuUWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxocTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApZZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmN1cnJlbnRUaW1lP2EuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk5iPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmJ9LApZaDpmdW5jdGlvbigpe3RoaXMuTmI9bnVsbH0sanE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLk5iJiYoYT0hMCk7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITApfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy52aWRlb1RhZztiJiZiLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkNrPSIzIjt0aGlzLmhkPTA7dGhpcy5ibj0zMDt0aGlzLmRjPVtdO3RoaXMub2I9W107dGhpcy55Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPQohMTt0aGlzLnN0YXR1cz10aGlzLmhkO3RoaXMuaWQ9Zi5WKDEwKTt0aGlzLkZmKGEpO3RoaXMuZm8oYil9LGY6ZnVuY3Rpb24oKXt9LGphOmZ1bmN0aW9uKCl7dGhpcy53aXx8KHRoaXMud2k9ITAsZi5qZigpKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlIoKTtRJiZRLnBjJiYhbWEmJihtYT0hMCxmLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLm1jKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5tYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKSxiPSEwLGU9bmV3IEk7d2luZG93W2UuZ2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0uaW5pdGlhdG9yIT1mLm1jKCkmJih0aGlzLkdmKCksYj0hMSk7cmV0dXJuIGJ9LEM6ZnVuY3Rpb24oYSxiKXt2YXIgZT0hMDthJiYoZT0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy54bSgpO2lmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5kYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5kYyYmMDx0aGlzLmRjLmxlbmd0aCYmCih0aGlzLmRjPWYudW5pcXVlKHRoaXMuZGMpLGYudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLmRjLmpvaW4oIiwiKSkpO2lmKHRoaXMub2Ipe2Zvcih2YXIgZT0wO2U8dGhpcy5vYi5sZW5ndGg7ZSsrKXRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPT10aGlzLnljW2FdJiZiLnB1c2godGhpcy5vYltlXS5kZXRhaWwpLHRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPHRoaXMueWNbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy55Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuQ2t9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZH0sb2c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLmtnfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5oZH0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihmKXtmLmZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPWEuUnA7Yj9iLnBhP2IucGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7dmFyIGE9ITEsZz0iIjtiLmdldEVycm9yJiYoYT1iLmdldEVycm9yKCkpO2F8fGIuZGV0YWlsLmdldEVycm9yJiYoYT1iLmRldGFpbC5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZSYmKGcrPWEuZ2V0RXJyb3JDb2RlKCkpO2EuZ2V0TWVzc2FnZSYmKGcrPWEuZ2V0TWVzc2FnZSgpKTtnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5nanx8cGE7KGZ1bmN0aW9uKGYpe2YuaGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuTGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkxqfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5uaD10aGlzLnhiPSExO3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YS5hdXRob3JpdHkmJmEuYXV0aG9yaXR5LmluZGV4T2YmJjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnRsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuOwphPXRoaXMudmlkZW9UYWcucGFyZW50Tm9kZS5wYXJlbnROb2RlfXRoaXMuVChhKX0sTGU6ZnVuY3Rpb24oKXtpZighdGhpcy54Yil7dmFyIGE9dGhpcy5OaCxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fCh0aGlzLnhiPSEwKTt0aGlzLlcoYil9fSxOYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmCjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe2IuZHVyYXRpb24mJmIucG9zaXRpb24mJjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LGxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTsKYi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5tZiYmKDAsdGhpcy5tZikoKX0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKCFhLmdldFN0YXRlfHwicGxheWluZyIhPWEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiYKYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxsYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGI9ITE7YS5nZXRWb2x1bWUmJmEuZ2V0Vm9sdW1lKCkmJihiPWEuZ2V0Vm9sdW1lKCkpO3JldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQWp8fHNhOyhmdW5jdGlvbihjKXtjLnpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuc2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLkhiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5IYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkhiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5IYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkhiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7Zm9yKHZhciBkPSJhZFBsYXkgYWRDb21wbGV0ZSBhZENsaWNrIGFkSW1wcmVzc2lvbiBhZE1ldGEgYWRTa2lwcGVkIGFkVGltZSIuc3BsaXQoIiAiKSxlPTA7ZTxkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuSGI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLmkoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChldmVudC5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpO2Eub24oInBsYXlsaXN0aXRlbSIsZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS50bD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTmI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/CnRoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnNlJiZ0aGlzLmkoKSl9LFltOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuS2U/dGhpcy5LZSsrOnRoaXMuS2U9MTp0aGlzLkplP3RoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy56anx8dGE7KGZ1bmN0aW9uKGMpe2MuQmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWWwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPQpbXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLnhifHx0aGlzLk0oZSl8fHRoaXMuRW0oZSl8fCh0aGlzLk4oZSksZT1uZXcgdGEoZSx0aGlzLkcpLGUuSigpLGUuZigpKX19dGhpcy5QKCl9fSxicTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxZbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQmp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkNsfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Yuc2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksCmE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFllOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5UYigxMCk7dGhpcy5WZj0hMDt0aGlzLkRjPXRoaXMudWg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmNsKCksdGhpcy56YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuRCgidC1vbmxpbmUuZGUiKT8KITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuSD9hLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYS5IJiZhLkguSWE/YS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkgmJmEuSC5JYT90eXBlb2YgYS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5wZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLAphLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5wYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueWU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9CnRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy50aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLlJuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkRjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkVjPSEwO2lmKGYuRCgiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmCmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5FY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxhcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGNsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0sCnpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkRjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGM/dGhpcy53KCk6KHRoaXMuZGEoITApLAp0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnVoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwKKGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGRsOmZ1bmN0aW9uKCl7dGhpcy5KY3x8KHRoaXMuSmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihhLmFkcyl7aWYodGhpcy5KYyE9YS5hZHMuc3RhdGUmJih0aGlzLkpjPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRsKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYKMTAwOT09dGhpcy5LKXJldHVybiEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl7dmFyIGE9ITE7Zi5UYygiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYil7Yj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVWwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fAoodGhpcy5WZj0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkModGhpcy5WZixmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbmw6ZnVuY3Rpb24oKXt0aGlzLmtxfHwoMTA8dGhpcy5ncD8odGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmdwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sWG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaHApe3RoaXMuaHA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMucmt8fHlhOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2VdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmCihhPWEucGxheWVyLnBsYXllcigpLGIucHVzaChhKSk7aWYoMDxmLlJlKGIpKXtmb3IodmFyIGUgaW4gYiliLmhhc093blByb3BlcnR5KGUpJiYoYT1uZXcgeGEoYltlXSksYS5oYXx8dGhpcy5NKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYSksKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLkFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5Bbnx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3RoaXMuc2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LEJuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTmIsZT10aGlzLmthKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLnBjJiYoMDw9ZS5pbmRleE9mKGQpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmCmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLlVqfHxSOyhmdW5jdGlvbihmKXtmLlRqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8KHRoaXMuUGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5QYisrLDE1PHRoaXMuUGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sCmVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmYihlLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCnRoaXMuSyk7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMuS2w9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5CbihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihmKXtmLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9CjE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPAphLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGU9bmV3IFIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgQ2EoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVmp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm1ufHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkRuPQphLnBvc2l0aW9uaW5nO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUud2lkdGg9YS53aWR0aDtlLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZS5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Uuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuRG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGUpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGIpfXRoaXMuVChlKTt0aGlzLlcoZSk7dGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLkNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DZCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1sOmZ1bmN0aW9uKCl7Zi56aCh0aGlzLkNkKTtmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTsKaWYoZi56aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLk0oYSkpKXt0aGlzLk4oYSk7KG5ldyBJYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Ibj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuSG58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSxNazpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5HaT0hMTt0aGlzLkxoPWQ7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmsmJmsuY2YodGhpcy5GYS51cmwpJiYhYyYmCihjb25zb2xlLmxvZygidGVzdDEiKSxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsInN0YXR1czAiLCEwKSk7ZyYmNCE9aC5yZWFkeVN0YXRlJiZnKGgpfS5iaW5kKHRoaXMpfWMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksayYmay5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTprLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLiRpPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxWbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYiwKYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17QXA6IkFkQ2xpY2tUaHJ1IixDcDoiQWRFcnJvciIsRHA6IkFkU3RvcHBlZCIsR3A6IkFkTGluZWFyQ2hhbmdlIixIcDoiQWRUYWdQYXJzZWQiLEtwOiJBZFZpZGVvQ29tcGxldGUiLE5wOiJBZExvYWRlZCIsT3A6IkFkU2tpcHBlZCIsUHA6IkFkU3RhcnRlZCIsRXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixGcDoiQWRJbXByZXNzaW9uIixCcDoiQWRDcmVhdGl2ZVZpZXciLElwOiJBZFZpZGVvTWlkcG9pbnQiLEpwOiJBZFBhdXNlZCIsTHA6IkFkVmlkZW9TdGFydCIsTXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5sZSxhW2RdKX0sVW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKCl7fSl9aWYodGhpcy5HYSYmdGhpcy5HYS5rZSlmb3IodmFyIGEgaW4gdGhpcy5HYS5rZSl0aGlzLkdhLmtlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuVm4oKTt0aGlzLkdhJiZ0aGlzLlVuKCl9fX0pKGMpO3ZhciBOYT1jLiRpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZmM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5XYj0iIjt0aGlzLmllPQoic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5iYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5YYj0iIjt0aGlzLlliPVtdO3RoaXMuWmI9W107dGhpcy5jZD1bXTt0aGlzLnVjPSIiO3RoaXMuSWI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm9jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMuRWI9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5GYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9CiExO3RoaXMuWmM9dGhpcy5QZD1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmZjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlFjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5XYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLApIT01BRF9BREJMT0NLRVI6dGhpcy5iYyx0ZXN0SGlkZTp0aGlzLlhiLHRlc3RUYWdzOnRoaXMuWWIsdGVzdFRhZ3NKUzp0aGlzLlpiLHRlc3RUYWdzWEhSOnRoaXMuY2QsdGVzdDNQQ29va2llOnRoaXMudWMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm9jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5FYixibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkZjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCwKYWRGYWxsYmFja0NvbmZpZzp0aGlzLmtkLHlpZWxkbGFiOnRoaXMuRGJ9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJgoodGhpcy5UZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUWM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuV2I9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5iYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuWGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYKKHRoaXMuWmI9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYodGhpcy5jZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudWM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm9jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLkViPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnNkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9CmIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLktmPWIuc2tpcEFsbG93ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxwbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09CiEwfSxabDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuV2soYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIiwKZj0iIixjPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuYmYoYik7Zj10aGlzLmFhKGIpO2c/KHRoaXMuU2MoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucmMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5mY3x8dGhpcy5xZCkmJihoPXRoaXMuZG4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5hbShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhkPWQuZXhlYyhiKSkmJihkWzJdfHxkWzVdKT9hPSEwOnRoaXMuU2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhiKSkmJmRbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFNjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYW06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihkIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2RdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuV3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxyYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYKKGE9ZC5mYWxsYmFjayk7cmV0dXJuIGF9LGNuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgbD1oW0JdLnNwbGl0KCI9Iik7Z1tsWzBdXT1sWzFdfWZvcih2YXIgayBpbiBhW2NdLnN1YnZhbHVlcylnW2tdPXRoaXMuSGgoZ1trXSxrLGFbY10uc3VidmFsdWVzW2tdKTtoPVtdO2ZvcihrIGluIGcpaC5wdXNoKGsrIj0iK2dba10pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9az1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWsucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sZG46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmZjJiYoYj10aGlzLmNuKGIsdGhpcy5mYykpO3JldHVybiBifSxsbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5mbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxmbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEua28oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmpvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxmLGMpe2s9dGhpczt0aGlzLmRmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1kO3RoaXMuY2U9Zzt0aGlzLmpjPWY7dGhpcy55YT1jfHx7fTt0aGlzLmxsKCk7dGhpcy5UbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlJtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5IYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkhjKCl9Y2F0Y2gobCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGQpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSx5bDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sVG06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUWMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMubm0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuSGMoKX0uYmluZCh0aGlzKSwhMCl9LFJtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlRiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChlKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmpjPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5qYz0hMSk7dGhpcy5qYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmpjP3RoaXMuamMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuTGMobC55bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbm06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5XYnx8dGhpcy5BYXx8dGhpcy5IYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxIYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5EKCJ3ZWIuZGUiKXx8Zi5EKCJnbXgubmV0Iil8fGYuRCgiZ214LmF0Iil8fGYuRCgiZ214LmNoIil8fGYuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLldiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5WZT1kLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLldiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucmMoKSksZD10aGlzLmFhKHRoaXMuV2IpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuV2IrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZT1hLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7aWYoIXRoaXMub2MmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm9jPSEwO3RoaXMuVWMoITApOwpyZXR1cm59fWU9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihlPSEwKX1jYXRjaChoKXt9aWYoIShlfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihkLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlhiPWQudGVzdGhpZGV8fCIiO3RoaXMuWmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5jZD1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudWM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5mYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZC5qc3BvcHVwc3x8ITE7dGhpcy5BYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkZjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWQueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1kLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm9jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5vYz0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLk9vKCkmJih0aGlzLlhifHx0aGlzLlpifHx0aGlzLllifHx0aGlzLmNkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuR28oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFhtOmZ1bmN0aW9uKGEpe3RoaXMuSGk9ITA7dmFyIGU9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZT10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZSkpLGU9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmUsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihlKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuVGModGhpcy5yYygpLCJQT1NUIixlLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBlPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztlPWUucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGUsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitlKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGUsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy5FYj0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0sRm86ZnVuY3Rpb24oKXtpZih0aGlzLlhiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5iYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuWGIpO2Uuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5YYik7ZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpOwphPWR9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKCkpLHRoaXMuS28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLlhkKHRoaXMuYmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5ZYj10aGlzLmNkKSYmdGhpcy5ZYi5sZW5ndGgpe3ZhciBkPXRoaXMuWWIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxLbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2YoKSYmZSgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZCgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5UYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGUuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBlKCl7dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlpiJiZ0aGlzLlpiLmxlbmd0aCl7dmFyIGQ9dGhpcy5aYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LExvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihlLGQpe2Q9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnVjKXRyeXtmLlRjKHRoaXMudWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSWI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixlPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLkViJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5ZaygpO3RoaXMudWMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5JYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLklifSl9LFlrOmZ1bmN0aW9uKCl7dGhpcy5aYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlpjLmlkPWYuVigxMCk7dGhpcy5aYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWmMpO3ZhciBhPXRoaXMuWmMuY29udGVudFdpbmRvdyxlPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5QZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxrbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucG0oKSl7dmFyIGE9dGhpcy5abCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGUsZCxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuR2k9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGdsOmZ1bmN0aW9uKCl7dGhpcy4kbXx8KHRoaXMuJG09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoZz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5TYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChlKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChlKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSxFbzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30saWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuJG8uYmluZCh0aGlzKSx0aGlzLlpvLmJpbmQodGhpcykpfSwkbzpmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbDt0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuSmwoKX0sWm86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5MYyhsLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuQWJbYV07InJlcXVlc3QiPT1lLnR5cGUmJmYuZWIoZS51cmwsZS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1lLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmdhKCldPXRoaXM7Zi5lYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxUYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPQoiIixkPTA7ZDxhO2QrKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZX0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPSIiLGQsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGV9LGFhOmZ1bmN0aW9uKGEpe3ZhciBlPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2VbZ11dPWFbZ118fCIiO2QucXVlcnlLZXk9e307ZFtlWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGUpe2ImJihkLnF1ZXJ5S2V5W2JdPWUpfSk7cmV0dXJuIGR9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9IiIsZSxkO2ZvcihlPTc7MDw9ZTtlLS0pZD1hPj4+NCplJjE1LGIrPWQudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChuJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGYsNSkrKG4mcHx+biZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWQoZiw1KSsobl5wXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1kKGYsNSkrKG4mcHxuJnJ8cCZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZChmLDUpKyhuXnBecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2Esaz1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Daj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuQ2p8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMua2M9dGhpcy5yZD0hMTt0aGlzLlVrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuWGs9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5vZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Taz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlhjPXRoaXMuVGQ9ITE7dGhpcy5GaD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLnBjPSExO3RoaXMudmw9Zi5WKDEwKTt0aGlzLlNiPWYuVigxMCk7dGhpcy5RYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy5hYz10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMueGM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Qbz10aGlzLkdiPXRoaXMuUmI9ITE7dGhpcy5CYz1bXTt0aGlzLnFjPXt9O3RoaXMudm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkdjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGU9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZX0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuT2ImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLndvKCk7Zi5vKGwuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxlLGQsZyl7dGhpcy5HYj0KZDt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5rbCgpLGc9ay5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLmFvKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZSxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZSxkKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy5hYz10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5xbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5CYz10aGlzLmFoKGEpO3RoaXMub2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMuam0oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGU9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZT10aGlzLmFoKGIucGFyZW50KSksZS5wdXNoKHRoaXMuVGwoYikpKTtyZXR1cm4gZX0sVGw6ZnVuY3Rpb24oYSl7dmFyIGU9IiIsZD1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2U9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylkLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDplLGNyZWF0aXZlSUQ6ZH19LGptOmZ1bmN0aW9uKGEpe3ZhciBlPVtdLGQ9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGUubGVuZ3RoO2grKylkLnB1c2goYS51YihlW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZT0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGU9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZT1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTplPT1GLm1lLmNvZGU/Zi5vKGwudXAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGU9PUYuaGcuY29kZSYmZi5vKGwuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGwuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnhvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSWImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5JYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhsLmFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8obC52cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhsLndwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8obC5obix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8obC5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8obC5Zbyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMubGMoYSk7dGhpcy5SYSgpfSxsYzpmdW5jdGlvbihhKXt2YXIgZT05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZT1hLmVycm9yLmNvZGUsOTAxPGUmJihlPTkwMCkpO2ZvcihlPXsiW0VSUk9SQ09ERV0iOmV9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLmdmKGQudXJsLGQudHlwZSxlKX1jYXRjaChnKXt9fSxxbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBlPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGU9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1lO2U9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2QmJmQuZW52dmFycyYmKGc9ZC5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRmQmJihnPWQuRmQoKSk7Zy52aWRlb1Nsb3QmJihlPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31lLnZxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihlLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZS5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZS5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5TayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGUudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZS5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZSxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLndmJiZlLmxvYWQoKTtpZih0aGlzLm1pKGUpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGUpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWU6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpfWNhdGNoKGspe3RoaXMudmlkZW89CmV9fWVsc2UgdGhpcy5iLnJsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxvbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnhjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGwuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlJrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVmIoIm11dGVkIiwiY29udGVudCIpO2YubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRix0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5tbSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGsuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRiwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8obC5JYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5uYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5CYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmpwKCksdGhpcy5hLm5jKCEwKSwhdGhpcy5hYykpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5hYz17ZWw6dGhpcy5GLGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8obC5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubmMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5uYyghMCksdGhpcy5ycCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5wcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm9wKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhsLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5GY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMua3AoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnRjKCkpLHRoaXMubHAoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlZiKCJtdXRlZCIsInVzZXIiKSxmLm8obC5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVmIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGwuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGwudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkYsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxrcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnhjPSEwfSxscDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54Yz0hMX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8obC51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8obC50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHBwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhsLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sb3A6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGU9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7Zi5EZSgpO3RoaXMuRj0hMTt0aGlzLlJhKGEpfX0saXA6ZnVuY3Rpb24oYSl7dmFyIGU9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZSYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZT1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZS5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhsLnRwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApOazpmdW5jdGlvbihhLGUpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuU2MoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZChlLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuZnAuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChlLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmtjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2N8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuVWspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlJiJiYhdGhpcy5rYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUmJ8fCh0aGlzLlJiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGUpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuY3AoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuYnAoKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLnZpZGVvLnBsYXkoKTtpZihlJiZlWyJjYXRjaCJdKWVbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5zYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnNjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8obC5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPVtdLGQ9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWQ9Zi5maChhW2ddKSxlLnB1c2goZCk7YT17aGFzaGVzOmV9O2E9bC5UYShhLHRoaXMudSgpKTtmLnVvKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Layh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhsLmxuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkZifHx0aGlzLmIuemMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmtjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZSl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5wYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRmImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIuemMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSxmcDpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmtjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5nbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5wYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhsLkljLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlNvKGEpO2lmKCF0aGlzLmFjKXt2YXIgZT0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuYWM9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhsLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmUscGVyY2VudDpkLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX1kPSIiO3RoaXMuYi5MZiYmKGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuTGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhsLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkZiPyh0aGlzLmtjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxlLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFNvOmZ1bmN0aW9uKGEpe2YubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5SYnx8KDA9PWEmJih0aGlzLkdiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLkdiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5JYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSWIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5SYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGwudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8obC5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGUpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZSwhMCl9LHdvOmZ1bmN0aW9uKCl7Zi52YyhbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YudmMoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtmLnZjKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi52YyhbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFZiOmZ1bmN0aW9uKGEsZSl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZSwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZSl7aWYoIXRoaXMuUmIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5rbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGM9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkdjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGwuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZSl0cnl7dGhpcy5iLlBhPXRoaXMuemwodGhpcy5iLlBhLGEpfWNhdGNoKGspe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZT0iIjt0aGlzLmNnJiYoZT0iX3ZwYWlkIik7dGhpcy5kZCYmKGU9Il93ZWxlY3QiKTtyZXR1cm4gYStlfSxnZjpmdW5jdGlvbihhLGUsZCxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihlPXRoaXMuQS53YShhKSxkJiZlLk1rKGQpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuT2soYSksdGhpcy5BLkxhKGUsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE9rOmZ1bmN0aW9uKGEpe3RoaXMucWNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5xY1thXT0iY2xvc2VkIn0sb2w6ZnVuY3Rpb24oKXt0aGlzLnFjPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZTtmb3IoZSBpbiB0aGlzLnFjKXRoaXMucWMuaGFzT3duUHJvcGVydHkoZSkmJiJvcGVuIj09dGhpcy5xY1tlXSYmYSsrO3JldHVybiBhfSxrbTpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1lfSl9LHpsOmZ1bmN0aW9uKGEsZSl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1lfSl9LGNwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy50YygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGUpe31mLm8obC5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRmN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZSl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxicDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBlPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGU9dGhpcy5BLnRkKTtlJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLktiLmJpbmQodGhpcyksMUUzKmUpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sS2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMudmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuU2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlFiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Sby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5MYigpO3RoaXMuS2IoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZkLmFwcGVuZENoaWxkKGgpO2QuYXBwZW5kQ2hpbGQoYyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuTGIoKTt0aGlzLktiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUud2lkdGg9IjEwMCUiLGUuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGUuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGUuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLAplLnN0eWxlLmJvdHRvbT0iMHB4IixlLnN0eWxlLnpJbmRleD0iMTAwMDAiLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmUuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGUpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhsLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLkxiKCl9fSxMYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHRjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlNiKTt0aGlzLnhjPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMueGM9ITEpOihmLm1hKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy54Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGwucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwidXNlciIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVmIoIm11dGVkIiwidXNlciIpLGYubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5WYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGwuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5RYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxzYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5zYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEuRWJ8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuT2ImJnRoaXMuVG8oKXx8KHRoaXMueWQ9ITAsdGhpcy5HYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5HYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGU9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixkPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZStkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZT1rLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGN8fChhPQohMCxlLmFkRmFsbGJhY2tVUkx8fChlLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkdjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuR2M/ImFueSI6IiIpKyhlLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5YYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuR2MmJmUuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhjfSwkbDpmdW5jdGlvbigpe3ZhciBhPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxlPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1lLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZS5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmUuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBlPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuJGwoKTt0aGlzLkdjPXRoaXMuWGM9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBlPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2UsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy52bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlpuKCksdGhpcy5wYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhsLnVsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5GYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5CYyYmMDx0aGlzLkJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5CYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5YaysiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5Fa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtlPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy5BYz10aGlzLkNjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGUsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGU9IiI7Yi5xdWVyeUtleSYmKGU9Yi5xdWVyeUtleS5odnApO2UmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmsud2Eoay5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihmLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuRCgiZmFuZG9tLmNvbSIpfHxmLkQoImdpZ2EuZGUiKXx8Zi5EKCJraW5vLmRlIil8fGYuRCgic3BpZWxldGlwcHMuZGUiKXx8Zi5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuRCgiZ2lnYS5kZSIpfHxmLkQoImtpbm8uZGUiKXx8Zi5EKCJzcGllbGV0aXBwcy5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxsKCl8fG0oKXx8ImFwcHNwb3QiPT1lKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChrLldkKGgpKSsiJnR5cGU9anMiLGI9ay53YShrLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9ay53YShrLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9ay5MYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixlKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk9iKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtlW2JdPXt9fWVsc2UgZS5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBlPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5PYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuT2J8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGsuRW8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZDtlLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWUucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZSk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxlPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1lPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkpuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5XYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGUpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuV2MoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFdjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxlLHtBZFN5c3RlbTp0aGlzLlNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlZvKCkmJnRoaXMudGYodGhpcy54bCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5DYz8odGhpcy5DYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuV2MoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLkFjPyh0aGlzLkFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLldjKCkpOnRoaXMucGFyZW50LkloKCl9LFZvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLk5jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRmI9YS5GYj9hLkZiOnRoaXMuQ2M7YS56Yz1hLnpjP2EuemM6dGhpcy5BYzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3RoaXMucGFyZW50LnRmKGEpfSx4bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk5jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuVmwoKTthLkNxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUmwoKTthLkxmPXRoaXMuaW0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZT0hMTsoZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZlLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLldsKCkpOmEuUGEuY29uY2F0KHRoaXMuZW0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5sYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmxjJiZ0aGlzLnBhcmVudC5sYyhhKSxiPTAsdGhpcy5XYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxsYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5sYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGU9bmV3IFRhKGEsYik7ZS5vcmlnaW49dGhpcztyZXR1cm4gZX0sTW86ZnVuY3Rpb24oKXtyZXR1cm4gYjxlfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5OYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxKbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZSl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFNsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGQ9YVtlXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZCYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZSl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspYi5wdXNoKHtpZDphW2VdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZV0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtlXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2VdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZV0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxYcDphW2VdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2VdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxSbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZT0hMSxkPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZT1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2U9Yn1kLnB1c2goZSk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZCxoPWMpOihiPWUsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGltOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGU9ITEsZD0hMTt0cnl7ZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9ZS5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYudG8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5hbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMuemM9dGhpcy5GYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLldqPWE7YS5wcm90b3R5cGU9e3JsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTy5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGNtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGU9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShlPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZS5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2RdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmNtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxtbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk8ubGVuZ3RoO2UrKylpZigwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tlXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuV2p8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMubWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0seHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx5cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLk9tfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWU7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Eanx8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1lO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuZXA9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnpwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy5aaFthXSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ycT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Xbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Qbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzpkLGZyYW1lOmYsd246Yyx2ZW5kb3I6ZS5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMucWYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy5xZltlXTtkLnR5cGU9PT1hJiZkLiRrKHRoaXMuWGwoYSkpfX0sWGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7QXE6ITAsenE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7b3E6InZpZGVvIixEcToianNDdXN0b20iLEVxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRnE6MSxZcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxsbTpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMuYmUubGVuZ3RoO2UrKylpZih0aGlzLmJlW2VdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZV0ud247cmV0dXJuIiJ9LFduOmZ1bmN0aW9uKGEsZSl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5sbShlKSx2ZW5kb3I6ZX0pO3RoaXMudm8oKX0sUG46ZnVuY3Rpb24oYSxlKXsidmlkZW8iPT09YT90aGlzLmVwLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZSl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxlKX0semc6ZnVuY3Rpb24oYSxlKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKJGs6ZSx4cTohMX0pfSx2bzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLnFxKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkJxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLnNtfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuY29uZj1lfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5nYz1bXX1jLmFqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBlPXt9LGQ9ITEsYz0wLGU9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixjPWUubGVmdCxlPWUudG9wKTtmPXt4OmMseTplfTtmLnBvc2l0aW9uPWQ7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBlPTAsZD0wLGM9ITEsZj10aGlzLnVtKGEpLGg9e307YTspZSs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGUrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZSx5OmR9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSxDbzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8obC5JYyx0aGlzLmMubCgpKX0sWm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8obC53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy4kYyYmdGhpcy5jLiRjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxlJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxObDpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmdldFBvc2l0aW9uKGEpO2UucG9zaXRpb24/ZS5wb3NpdGlvbj1lLnBvc2l0aW9uOmUucG9zaXRpb249ImFic29sdXRlIjtlLndpZHRoPWEub2Zmc2V0V2lkdGg7ZS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGV9LG5jOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuTmwodGhpcy50Yik7aWYoZS54IT10aGlzLkhhLnh8fGUueSE9dGhpcy5IYS55fHxlLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxlLndpZHRoIT10aGlzLkhhLndpZHRofHxlLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZS53aWR0aCYmMD09ZS5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1lO3RoaXMuYy4kYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmUueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZS55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1lLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdGhpcy5nY1thXSh7d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5nYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5hanx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMudW58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1lKWEuY29udGFpbmVySWQ9ZS5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Qaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmVjPXRoaXMuZWN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTmI7YSYmYS5wYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZWMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZT0wO2U8Yi5tb2R1bGVzLmxlbmd0aDtlKyspe3ZhciBkPWIubW9kdWxlc1tlXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuVnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5tcSgpOiExfSxOYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTmMoKTotMX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5lYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmVjfHwzMDI9PXRoaXMuZWM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZWMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5mbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Qanx8Y2I7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy4kai5Eay5Caz93aW5kb3cuT08uJGouRGsuQmsuVHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IGNiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlJqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMucW58fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlNpfHxnYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZT1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxlPWEuZGF0YS5tZXNzYWdlKTtmLkQoIndlbHQuZGUiKSYmIXRoaXMuc24mJih0aGlzLnNuPSEwLGYuRWkoYikpOzEyMDUhPWImJig5MDA9PWImJjA8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRWcoYS5hZEVycm9yRXZlbnRzKTsKYS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe2YuRCgid2VsdC5kZSIpJiYhdGhpcy5ybiYmKHRoaXMucm49ITAsZi5GaSgpKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaGI9Yy5SaXx8aGI7KGZ1bmN0aW9uKGMpe2MuVGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxVaDpmdW5jdGlvbihhKXthPW5ldyBnYihhKTthLmhhP3RoaXMuUCgpOnRoaXMuTShhKXx8KGEuUWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLk4oYSksKG5ldyBoYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1sfHwodGhpcy5NbD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuVWgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlVoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgaWI9Yy5UaXx8aWIsVD1uZXcgaWIodCk7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgamI9Yy5RbHx8amI7bmV3IGpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmtrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYSl7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGEpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ra3x8VTsoZnVuY3Rpb24oYyl7Yy5qaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3Lm5kKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLnBuKGEpfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpOwp3Lm5kKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5vbSgpfSxwbjpmdW5jdGlvbihhKXt2YXIgYj0iIixlO2ZvcihlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSl7Yj1pc05hTihhW2VdKT8hMTphW2VdO2lmKDEwMDk9PWFbZV18fDEwMDE9PWFbZV18fDMwMz09YVtlXXx8NDAzPT1hW2VdKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2VdKWlmKGFbZV0uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbZV1bZF0pPyExOmFbZV1bZF0sMTAwOT09YVtlXVtkXXx8MTAwMT09YVtlXVtkXXx8MzAzPT1hW2VdW2RdfHw0MDM9PWFbZV1bZF0pKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufX10aGlzLm0oImFkZXJyb3IiLGIpO3RoaXMuQygpfX0pfSkoYyk7dmFyIFY9Yy5qa3x8VjsoZnVuY3Rpb24oYyl7Yy5saz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO3RoaXMuTGQmJihhPWYuQWwoYSx0aGlzLkxkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTShkKSl7dGhpcy5OKGQpO3ZhciBjPW5ldyBWKGQsdGhpcy5HKTtjLmYoKX19Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IoZT1hW2JdO2UucGFyZW50RWxlbWVudDspe3ZhciBlPWUucGFyZW50RWxlbWVudCxoPWUuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5MZHx8Cih0aGlzLkxkPVtdKSx0aGlzLkxkLnB1c2goYVtiXSksZD1uZXcgVShoKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksYz1uZXcgVihkLHRoaXMuRyksYy5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxuZDpmdW5jdGlvbihhLGIsZSl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYV18fCh0aGlzLmNhW2FdPXt9KTt0aGlzLmNhW2FdW2JdfHwodGhpcy5jYVthXVtiXT1bXSk7dGhpcy5jYVthXVtiXS5wdXNoKGUpfSxObzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVtiXSl0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGEpLHRoaXMuWW4oKSYmKHRoaXMuemYoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgZT0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihlPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtiXVtlXSYmMDx0aGlzLmNhW2JdW2VdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2JdW2VdLmxlbmd0aDtkKyspdGhpcy5jYVtiXVtlXVtkXShhKX19LG9tOmZ1bmN0aW9uKCl7aWYodGhpcy5WYylmb3IodmFyIGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5WY1thXSxlPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbZV1bZF0mJjA8dGhpcy5jYVtlXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmNhW2VdW2RdLmxlbmd0aDtjKyspdGhpcy5jYVtlXVtkXVtjXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1hLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9YS5vRXZlbnRUeXBlLmgmJncuTm8oYSl9fSl9KShjKTt2YXIga2I9Yy5sa3x8a2Isdz1uZXcga2IodCk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5FbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBsYXkoKX0pfSwKdWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLk9pfHxtYjsoZnVuY3Rpb24oYyl7Yy5QaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIithKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5QaXx8bmI7KGZ1bmN0aW9uKGMpe2MuUWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYSYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT0KYVtiXSxkPSIiO3RyeXtkPWUuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGMpe2Q9ZS5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgbWIoZCk7dGhpcy5NKGYpfHwodGhpcy5OKGYpLChuZXcgbmIoZix0aGlzLkcpKS5mKCkpfWNhdGNoKGgpe319dGhpcy5QKCl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGUgaW4gdGhpcy5NYSlpZihiPT10aGlzLk1hW2VdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5RaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFiPWMuem58fHFiO25ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy5wbHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSksdGhpcy5wbD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSmcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz1hLnNvdXJjZS5DSE9PU0VSX0FCfHwiIixoPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYywhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9pbnRlcmFjdGlvbiIsCmMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLkpnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuTm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmljfHwodGhpcy5pYz1bXSk7dGhpcy5pYy5wdXNoKGEpfSxxbDpmdW5jdGlvbigpe2lmKHRoaXMuaWMmJnRoaXMuaWMubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5pYy5sZW5ndGg7YSsrKXRyeXt0aGlzLmljW2FdKCl9Y2F0Y2goYil7fX0sRmQ6ZnVuY3Rpb24oKXtpZih0aGlzLktjKXJldHVybiB0aGlzLktjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE5uOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuTmp8fHJiOyhmdW5jdGlvbihjKXtjLk1qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5EaT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMuRGkmJih0aGlzLmkoKSx0aGlzLkRpPSEwLHRoaXMubmEoKSk7Yi5VYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSWV8fCh0aGlzLkllPTEpLHRoaXMuSWUrKywxMDA8dGhpcy5JZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTWp8fHNiOyhmdW5jdGlvbihjKXtjLk9qPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7Zi50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgZT0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspZT0KbmV3IHJiKGFbZF0pLHRoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IHNiKGUsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciB0Yj1jLk9qfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlRrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdmI9Yy52a3x8dmI7KGZ1bmN0aW9uKGMpe2MudWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LExuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMuRGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuTG4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuRGMpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5oYltiXSYmMzAzIT10aGlzLmhiW2JdJiY0MDMhPXRoaXMuaGJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLmphKCk7CmVsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy51a3x8d2I7KGZ1bmN0aW9uKGMpe2Mud2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBlPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuTShlKXx8LTE9PWUuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihlKSwobmV3IHdiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB4Yj1jLndrfHx4Yix5Yj1uZXcgeGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgemI9Yy5HbHx8emI7bmV3IHpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmRrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnVmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5DbigpfS5iaW5kKHRoaXMpLDUwMCl9LENuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnVmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LHlvOmZ1bmN0aW9uKCl7dGhpcy51Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuZGt8fEFiOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5abT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMud2N8fCh0aGlzLndjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLndjfHx0aGlzLndjKyssdGhpcy53Yzw9dGhpcy5abT8odGhpcy53YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkueW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuY2t8fEJiOyhmdW5jdGlvbihjKXtjLmVrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBCYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIENiPWMuZWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkZsfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5iaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE5hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5ia3x8RmI7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVWEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5RbSgpOnRoaXMuR2coKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxzbDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sUW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpiKCk7IWEucGEmJmEuWSYmYS5TcCYmYS5VcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEdnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgZTthOnthPWEuZ2V0RXJyb3IoKTtmb3IoZSBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtlXSl7ZT1hW2VdO2JyZWFrIGF9ZT12b2lkIDB9MTAwOT09ZXx8MzAzPT1lfHw0MDM9PQplPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGUpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5KYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5VYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sbnE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSmIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuYWt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0samw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IEdiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLmpsKGFbYl0pO3RoaXMuUCgpfX0pO2MuZ2QuSmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBkPQpiW2VdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0mJmJbZV0uZmVybW9kJiZhLnB1c2goYltlXS5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy52anx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sJGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVWE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLkpqfHxYOyhmdW5jdGlvbihjKXtjLklqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnZmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMudmY9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGU9YS5wbGF5ZXJDb250YWluZXI7ZSYmdGhpcy52ZiYmZSE9dGhpcy52Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLkQoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLnNxKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSWp8fFk7KGZ1bmN0aW9uKGMpe2MuS2o9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLAplPWIubGVuZ3RoLGQ9MDtkPGU7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLnpmKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBHLEtiPWMuS2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5ZaXx8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubWo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxlPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksZT1hLkdldEVsKCksYiYmZT8odGhpcy5UKGUpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5tanx8TmI7KGZ1bmN0aW9uKGMpe2MubGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxCZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksZT0wO2U8Yi5sZW5ndGg7ZSsrKXRoaXMuaGFuZGxlRXJyb3IoYltlXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLmxqfHxPYjsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgTmIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgT2IoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFBiPWMubmp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmJqfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGU9ITE7YT8oZT1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZlPyh0aGlzLlQoZSksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuVml8fFNiOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy5XaXx8VGI7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGU9bmV3IFNiKGFbYl0pO2UuaGF8fHRoaXMuTShlKXx8KHRoaXMuTihlKSx3aW5kb3cuYnJpZHBsYXllcj1lLChuZXcgVGIoZSx0aGlzLkcpKS5mKCkpfX10aGlzLlAoKX19KX0pKGMpO3ZhciBVYj1jLlhpfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMubm58fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSwkZDpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LE1uOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuemt8fFhiOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmhjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0saGM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkdrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuR2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmhjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuUW4oKX0sUW46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5Lbj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5Lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmhjKGEpKX19KX0pKGMpO3ZhciBZYj1jLnlrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhLk1uKCksYT1uZXcgWWIoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMuQWt8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5kanx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2V8fChlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtlPyh0aGlzLlcoZSksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5lbj1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW59LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlpkKGEpfS5iaW5kKHRoaXMpKX0sWmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5va3x8TjsoZnVuY3Rpb24oYyl7Yy5uaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8Cih0aGlzLlBiPTApLHRoaXMuUGIrKywxNTx0aGlzLlBiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLm1vKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5LPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT0KYS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSYmYVtjXSYmYVtjXS5hZEVycm9yJiZhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMubmt8fE87KGZ1bmN0aW9uKGMpe2MucGs9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuemYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBiYz1jLnBrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5janx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ganx8WjsoZnVuY3Rpb24oYyl7Yy5Faj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuVGIoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy56YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx6YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRWp8fGFhOyhmdW5jdGlvbihjKXtjLkdqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGVjPWMuR2p8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLlBtfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLmpqfHxoYzsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5GZygpfSxGZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMuaWp8fAppYzsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuUCgpO3JldHVybn1pZighdGhpcy5NKGEpKXt0aGlzLk4oYSk7KG5ldyBpYyhhLHRoaXMuRykpLmYoKTt0aGlzLlAoKTtyZXR1cm59fXRoaXMuUCgpfX0pfSkoYyk7dmFyIGpjPWMua2p8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLkJsfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLkppfHxtYzsoZnVuY3Rpb24oYyl7Yy5JaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5BZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5BZS5iaW5kKHRoaXMpLDEwMCl9LEFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5JaXx8bmM7KGZ1bmN0aW9uKGMpe2MuS2k9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxUYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLlAoKTp0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBuYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5QKCl9fSl9KShjKTt2YXIgb2M9Yy5LaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuaGt8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5OZD1bXTt0aGlzLnlmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5Zaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmdtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnlmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy55ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5OZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxnbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy55ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxBbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV0uJGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5OZFthXS4kYil9fX0pKGMpO3ZhciByYz0KYy5Zanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy50bnx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGwuV28pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGwuam4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTWUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5EbHx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLk1iPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi53YigibmV3QWRkZWxpdmVyeSIpfWMuTGk9YTthLnByb3RvdHlwZT17aW86ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApjbzpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LGJvOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LGFkOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnptKCkpdGhpcy5NYi5nKHRoaXMuTWIuUWMsdGhpcy5NYi5xYSx0aGlzLk1iLnhmLGZ1bmN0aW9uKCl7dGhpcy5hZChhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTWIuamMpO2Vsc2UgaWYoay5EYiYmIWsuSGkpay5YbShmdW5jdGlvbigpe3RoaXMuYWQoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhsLkljLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5DbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLndiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTWIsaCk7bS4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmZmJiYoZD10aGlzLnBsYXllci5mZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5oZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx6bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LHNvOmZ1bmN0aW9uKCl7Zi53YigicHJlcm9sbCIpO2YuRWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuYWQoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX0scm86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRWYoInBvc3Ryb2xsIik7Zi53YigicG9zdHJvbGwiKTt0aGlzLmlvKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLmFkKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxUbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBvKHRoaXMucm8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sU2Q6ZnVuY3Rpb24oYSl7Zi53YigibWlkcm9sbCIpO2YuRWYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5hZChjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8obC53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxTbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmhvKHRoaXMuU2QuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGYoKX0sZjpmdW5jdGlvbigpe3RoaXMuc28oKTt0aGlzLnBsYXllci5sZiYmdGhpcy5TbigpO3RoaXMuVG4oKX19fSkoYyk7dmFyIGZhPWMuTGl8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy5pa3x8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFBoZVhhaWtpY2h1eGFUYWgsUGhlWGFpa2ljaHV4YVRhaCk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
148.251.51.163
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.163.51.251.148.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- c894038ee188c223e93dd1d92a606be67b9590fb3e4a6a0dc484bf3ae961c6ed
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame CF7D
|
0
0
|
34ms
34ms
|
Fetch
image/gif |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsu7cJSnTHSK-0J2f8XrK8fzoMwTv3I8OMFMXxjtj5AR7ZnPFG6c-NJQMC2BzxCqEiuxzOQk1gso4Y1ePcJd2Jommu_vAVbksMrFWstz0jxzOgohzqY2W88jEQ4NiuImmD_I4M9lrZYAXJWwERewmOZOon9Ie6dcNFpWf00FYGrkyyd-VB_48UwWbvCDPEQ4Al7AO-tp0aILbnYaRzwnI5MiZ9BmgbdwwuVsZCGJBhcFtCZ6ZZgBk4hx1d73WgL96ITtgxDrQPW_0BTMrful8g&sig=Cg0ArKJSzBRj68wpLOZyEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-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 CF7D
|
43 KB
14 KB
|
39ms
39ms
|
Script
text/javascript |
2a00:1450:4001:819::2002
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame CF7D
|
73 KB
28 KB
|
41ms
41ms
|
Script
text/javascript |
2a00:1450:4001:819::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_2020022401.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e76ea1aec186a6f4e42cf26dcdb80f5953a73b3a6d8aa2840fef68746bb8f693
- 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
|
59ms
24ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
pubads_impl_2020022401.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame CF7D
|
167 KB
61 KB
|
32ms
32ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame CF7D
|
113 B
175 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:819::2002
GOOGLE
|
|
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
461ms
34ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
459ms
34ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame CF7D
|
19 KB
8 KB
|
439ms
439ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3455440122878323&correlator=25834817136441&output=ldjh&impl=fif&eid=21062888%2C21063205%2C21065304%2C21065305&vrg=2020022401&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200228&iu_parts=5286166%2Cgiga.de%2CDFP-Passback-300x600&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=120x600%7C160x600%7C300x600&eri=6&cookie=ID%3Dec37b40774c24c40%3AT%3D1582885280%3AS%3DALNI_MYPEpeUwXUV2Mq7ifu-SmEeIQp-8g&cdm=www.giga.de&bc=31&abxe=1&lmt=1582885280&dt=1582885280932&dlt=1582885280794&idt=133&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=600&oid=3&adxs=1318&adys=125&adks=2714360146&ucis=w45hxs1qvcae&ifi=1&ifk=1567943126&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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%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=1176226199.1582885281&ga_sid=1582885281&ga_hid=993457053&fws=256&ohw=0&btvi=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 246a748c3fedfbc12ca0259b5ab8b5654b4b7f81ffdbfff19f9d5b2bf213027e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020022401.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame CF7D
|
66 KB
24 KB
|
32ms
32ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame CF7D
|
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_2020022401.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 CF7D
|
216 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
pixel
tracking.m6r.eu/consent/
|
44 B
209 B
|
49ms
48ms
|
Image
image/gif |
23.37.42.216
AKAMAI-AS
|
|
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 3FD2
|
0
0
|
35ms
35ms
|
Fetch
image/gif |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssOBETn54f_L3QudGFNPCDu_8nwpL5LpbUPBmqnZ4bZRiJz9WuYFA8uWLmJX5JGN8nO2apGUzqwE05RAXC3PiHRxjh-ilpj11kyDXH7hr8DPizgzcIOAt5curuhyp_U5QfpGLdEOOm1sjkYaM1tJXPiZwcX790PEK0JJwASKmxKrIt8xBC2FG1_pfMVVtpMpgfibJmTPODSbsQ6UJhXVH3u36cDSwiqxmDJRvCt4XzYQFArAMHiUJDsjbtMNRvlFNbIXqsSUrmBZNi_zFaP9w&sig=Cg0ArKJSzLSLVUZN7tm6EAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-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 3FD2
|
43 KB
14 KB
|
40ms
39ms
|
Script
text/javascript |
2a00:1450:4001:819::2002
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 3FD2
|
73 KB
28 KB
|
48ms
48ms
|
Script
text/javascript |
2a00:1450:4001:819::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_2020022401.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e76ea1aec186a6f4e42cf26dcdb80f5953a73b3a6d8aa2840fef68746bb8f693
- 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
|
26ms
26ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
281ms
33ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
GET
H2
|
200
|
pubads_impl_2020022401.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 3FD2
|
167 KB
61 KB
|
31ms
31ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame 3FD2
|
113 B
175 B
|
15ms
14ms
|
Script
application/javascript |
2a00:1450:4001:819::2002
GOOGLE
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame 3FD2
|
19 KB
8 KB
|
506ms
505ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=110944843121477&correlator=2025219329588565&output=ldjh&impl=fif&eid=21062833%2C21064368%2C21065583%2C21065588%2C21065304&vrg=2020022401&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200228&iu_parts=5286166%2Cgiga.de%2CDFP-Passback-300x250&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=300x250&eri=6&cookie=ID%3D1648125ef8a6a486%3AT%3D1582885280%3AS%3DALNI_Mau_123nP9RB2tqa81h_Unoz1KuUg&cdm=www.giga.de&bc=31&abxe=1&lmt=1582885281&dt=1582885281099&dlt=1582885281005&idt=90&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=250&oid=3&adxs=968&adys=282&adks=3816689529&ucis=7sckeu6ybz5u&ifi=1&ifk=2855988050&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&top=www.giga.de&dssz=8&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=1753083775.1582885281&ga_sid=1582885281&ga_hid=282127518&fws=256&ohw=0&btvi=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- b59eafb5a2321d7960298052e605dcf7642cbce9b7def89027d7893b380202e4
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020022401.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 3FD2
|
66 KB
24 KB
|
39ms
39ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame 3FD2
|
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_2020022401.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 3FD2
|
214 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
5303510603
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
205 B
|
23ms
22ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame FEB0
|
42 B
110 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:4001:821::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsscAQCqQh_IlBgLAc7wcoAniGXZ52aUFUBllTtVz_urEcn7NFO30y9y_QHHD0X7Ix6LkERD9aahdLcmoO0BGCwTAR49xzhlVFJHixckvaI&sig=Cg0ArKJSzNaWllEWV-u9EAE&adk=2257154448&tt=-1&bs=1585%2C1185&mtos=1010,1010,1010,1010,1010&tos=1010,0,0,0,0&p=125,429,215,1157&gcm=1&lcs=1&mcvt=1010&rs=0&ht=0&tfs=108&tls=1118&mc=1<e=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1582885280539&dlt&rpt=122&isd=0&msd=0&ext&xdi=0&msp=1&ps=1618%2C4917&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-4-11-11-0-0-0&tvt=1115&is=728%2C90&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&r=v&id=osdim&vs=4&uc=12&upc=0&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200226
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:821::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
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame 8DC3
|
0
0
|
6ms
6ms
|
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_2020022401.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 FEB0
|
73 KB
27 KB
|
42ms
41ms
|
Script
text/javascript |
2a00:1450:4001:819::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_2020022401.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 261a1dfeeccd3f6747dd6bb49e60579c2582910c2b225d23677772825bf7bc3d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame D94E
|
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_2020022401.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 CF7D
|
73 KB
27 KB
|
40ms
40ms
|
Script
text/javascript |
2a00:1450:4001:819::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_2020022401.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 261a1dfeeccd3f6747dd6bb49e60579c2582910c2b225d23677772825bf7bc3d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame BCF9
|
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_2020022401.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 3FD2
|
73 KB
27 KB
|
39ms
39ms
|
Script
text/javascript |
2a00:1450:4001:819::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_2020022401.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 261a1dfeeccd3f6747dd6bb49e60579c2582910c2b225d23677772825bf7bc3d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
Frame 3FD2
|
0
49 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:821::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_sz&pvsid=110944843121477&r=300x250&w=300&h=250
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:821::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
|
st
imprammp.taboola.com/
Frame C0FD
|
0
0
|
34ms
32ms
|
Document
text/plain |
151.101.14.49
FASTLY
|
|
General
- Full URL
- https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=92479FD575238780325174637002&cicmp=1657475&cijs=1&dast=V7KB4CFgO832lxhTCIDwS832lxhTCIDwUAAAAGBvQHHTkZ7ZYzEmu3mmyGu-FgMxkthpPRaDKZLGZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3Ch6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2a1zWVwvo-Vlt7w8RrvL8tb6PaeX3a23m512l1tleTtNp5fZ7pcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYABUfC_N0Wy8tmc_kDAOAhAAQAYECBBGAAp6kEoCLn4AQAAAAAAAAAgOX___8_BkCP-EwGIENp8MagB-DBB-BBCAAA4GIo9y_JrJMxZoGoILWIEQAAAECudLbd0aROqCyqAAAI0q0ArgAAAuAWoTZTsnQHJd7CAAAACMYW6GHx-80Ou8bvdhkAAAAAAAAAgNn_2T-akNJFYxrQpM6k2i8gAMDaLyAAAJu6AQC8CcAFXQCsziAmm9FuMjsAAACAu____389kNt4VraJx-VxThbOicm0HHk8FodlY1qtbCvjYrk9BpOrRF2Vdae-EWGZ_b6DgnJ6eswug4zlMhnUAlnT5PIbxAcNw3IyCOY3YYvRajLZLIez5WIyGI6Go9H-BG40wAkaDgeL3WCxWyyGk8VkNFgOFigQgwlOyHC0maxGu9VushxORqPZZrJBilatZqPNYLiaTWa73Wo4GC5HI6RozWI2mSxmo-VuM1hORoPhZDhEGFp5bDbfbuZWeTaOtWi5cbglrt1srZnZRh7TbDAbGTdu0etjeq0ms5ljZsWDOl0c-9qFi4IBUnsRXKQTzenyd7ksb83b4tY5fQ6LWKI5WaQT2WXf23hWtonH5XFOFs6JybQceTwWh2VjWq1sK-NiuS-tPDabbzdzqzwbx1q03DjcEtduttbMbCOPaTaYjYwbt-j1Mb1Wk9nMMfM3VsPJcLia7Jb7xmo4GQ5Xk91y36EzfFefs1F50yo8Qm31Oz2eZKaDwmWweDeq1XH8mRy0ZbPRqRNZvp-N0e_3-_1-v9_v9_sNWs_BbDAoYongdJFORC_j6SKWSJ4W6US4WbgWq43DOFw4Jr6JyTZarVyL5WIw2W0cu4VlIpYoTRfpRK97WRyGw-cveDgPD7Nfc3h5nA6z5y94OA8Ps1vnsrheRsvLbnl5jHaX5a31e04vu1tvNzvtLrfK8naaTi-z3aL-40MMV3PJYjCXLHZzxWK4SgAAAAAAAAAAS5gzbwIAAABwGshiMZgslgsAIca66688yuHNPZdc3PgxxJwuf5fL8ta8LW6d0-cw82Y!&excid=22&tst=1&docw=0&cs=false
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame FEB0
|
0
48 B
|
35ms
34ms
|
Image
image/gif |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstwWtoDq8tQ2DevyzuDTn5730yvC4ywq0OYPNXt4g7E8m90HyhwG0eGsnNdLHs-_vc62lC7KN-tyJLnTWVXAapCh62jS8yqmzfayXjyRGuDDcyXSjtTGQilJ9tJc-QXF86nOhQD3oHqem0MkbDhVrdRWyZQ5dGU8Ea-Rve6Rro5wOfRMho8I0GXa1Jg1j2bEgaW23difHZ_IeKZWwctuiNO0BwJHSaztKDPR7Rul2WYVnjbi11tb9inM1xGxNsy8bIKcnGrTARTBWWYbvfP&sig=Cg0ArKJSzNmtthIdZzrJEAE&urlfix=1&cbvp=2&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
sodar
Show response
pagead2.googlesyndication.com/getconfig/
Frame FEB0
|
7 KB
5 KB
|
35ms
18ms
|
XHR
application/json |
2a00:1450:4001:821::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020022401&st=env
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:821::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- b53efed83257494f94cfafa511ff9d1755ab652239517dc8f994d593f0d7370e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
sodar
Show response
pagead2.googlesyndication.com/getconfig/
Frame CF7D
|
7 KB
6 KB
|
23ms
17ms
|
XHR
application/json |
2a00:1450:4001:821::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020022401&st=env
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:821::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- f385711a66c1ac4275c8113896dbe6a08b7ff6a18a67c1a69dbf0b86b9edf9b0
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
sodar2.js
Show response
tpc.googlesyndication.com/sodar/
Frame CF7D
|
14 KB
5 KB
|
39ms
39ms
|
Script
text/javascript |
2a00:1450:4001:819::2001
GOOGLE
|
|
|
GET
H2
|
200
|
sodar2.js
Show response
tpc.googlesyndication.com/sodar/
Frame FEB0
|
14 KB
5 KB
|
42ms
41ms
|
Script
text/javascript |
2a00:1450:4001:819::2001
GOOGLE
|
|
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame CF7D
|
42 B
110 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:4001:821::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsseW5FN4O6xG8hvQezOxmgXC3YwTp-Q1HRVkX57DaekbgYvN238Cyqo4sToQGHaXwW4k9Vsi1204EPQe7mrVV5QIb7UgqNDRxEhWFjpGl4&sig=Cg0ArKJSzEi1VIYSaxMfEAE&adk=2778923653&tt=-1&bs=1585%2C1185&mtos=0,1021,1021,1021,1021&tos=0,1021,0,0,0&p=125,1318,725,1618&mcvt=1021&rs=0&ht=0&tfs=102&tls=1123&mc=0.89<e=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1582885280797&dlt&rpt=143&isd=0&msd=0&ext&xdi=0&ps=1618%2C4917&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-2-11-11-0-0-0&tvt=1123&is=300%2C600&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%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=20200226
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:821::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 584D
|
0
0
|
8ms
7ms
|
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
|
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/
Frame 1809
|
0
0
|
87ms
6ms
|
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
|
hic_qos
Show response
ssl.1.damoh.giga.de/
Frame E10D
|
24 B
409 B
|
345ms
26ms
|
XHR
application/octet-stream |
148.251.51.163
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,dmFyIFBoZVhhaWtpY2h1eGFUYWg9UGhlWGFpa2ljaHV4YVRhaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnhuKWsueWwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsayl9KX1rLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5aaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmspeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8obC5JYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9rLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5jbyhrKTtiLmJvKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGsuQWIubGVuZ3RoKXt2YXIgYj1rLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmxvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09aztmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxrKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5aaz0hMTt0aGlzLk9iPSJzZXR1cCI7dGhpcy5iZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRm4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxtYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxGbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5FbihiLmRhdGEpfSxFbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5UYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuT2woYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy53bChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxhbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sd2w6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGY9YltxXS5zcGxpdCgiOiIpLApkPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGY9ZC5zcGxpdCgiLSIpLGQ9ZlswXSt0aGlzLmFsKGZbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscT0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtxPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHEmJihmPTEwMC9xKmQqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFRiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZT0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZSs9Zy50b1N0cmluZygxNik7cmV0dXJuIGV9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHEsZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsbD0yNzE3MzM4Nzgsaz0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcT1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO3E9YztuPWg7bT16O3k9bDt0PWs7Zm9yKGc9MDsxOT49ZztnKyspcD1kKHEsNSkrKG4mbXx+biZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9MjA7Mzk+PWc7ZysrKXA9ZChxLDUpKyhuXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTQwOzU5Pj1nO2crKylwPWQocSw1KSsobiZtfG4meXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz02MDs3OT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Yz1jK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cmw9bCt5JjQyOTQ5NjcyOTU7az1rK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShsKSthKGspKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHEsZixjLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxxPWIuY2hhckNvZGVBdCh6KyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8cT4+NixoPXEmNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKHEpJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxobDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHE9ITEsZj0hMSxjPSExLGg9ITEsej0hMSxsPSExLGs9ITE7dHJ5e2E9dGhpcy5obCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZ2M/ITA6ITF9Y2F0Y2godCl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxrPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1xO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1sO2IuaXNCbGluaz1rO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17Tmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sU2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxWazpmdW5jdGlvbigpe3JldHVybiBiLk5pKCl8fApiLlVpKCl8fGIud20oKXx8Yi5TaigpfHxiLnhrKCl8fGIuSGooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuVmsoKX0sVWw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGUpe2EmJihkLnF1ZXJ5S2V5W2FdPQplKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxobTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuT2I9Yn0sTWU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5PYjt0aGlzLnVlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnhuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5NZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1sLlRhKGEsZCkpO2EmJih4PWwuVGEoYixhKSk7ZyYmKHg9bC5UYSh4LGcpKTtxJiYoeD1sLlRhKHgscSkpO2MmJih4PWwuVGEoeCxjKSk7aCYmKHg9bC5UYSh4LGMpKTtmLkxjKHgpfSxHbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmhtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5tYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuR24oYik7aWYoYSlpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWsucmMoKTtrLndhKGIsITApO2I9ay53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtrLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFrfHwhay5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihrLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9ay5yYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7ay53YShnLCEwKTtnPWsud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ay5MYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSx2YzpmdW5jdGlvbihiKXtpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmMoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWsucmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9ay53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtrLkxhKGQpfX0samY6ZnVuY3Rpb24oKXtrJiZrLlM/ay5pc0VuYWJsZWQmJmsuaWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihmWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBjPSExO2Q9ITE7ZD10aGlzLmViKGIsYS5BYSxmLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9CiExfWMudXJsJiZjLmhhc2gmJihjPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuUGsoYyxiKTtyZXR1cm4gY30sZWI6ZnVuY3Rpb24oYixhLGQsZyxmLGMsaCx4KXt2YXIgbD1jfHxrO2M9ITA7eCYmKGM9ITEpO2lmKGwmJmwuUylpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2wud2EoYixjKTtjPWwud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWMuZGF0YVt0XT1kW3RdO3JldHVybiBsLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZCxnLGYsbCxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFRjOmZ1bmN0aW9uKGIsYSxkLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGwgaW4gaClkKz0iJiIrbCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbbF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGs9bmV3IFhNTEh0dHBSZXF1ZXN0O2sub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWsucmVhZHlTdGF0ZXx8MjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1c3x8ZyhrKTtmJiY0PT1rLnJlYWR5U3RhdGUmJjIwMCE9ay5zdGF0dXMmJjIwMSE9ay5zdGF0dXMmJmYoayl9O3RyeXtrLm9wZW4oYSxiLHgpLGsud2l0aENyZWRlbnRpYWxzPWMsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBrfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5UYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYmQpZm9yKHZhciBjIGluIHRoaXMuYmQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5iZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlVtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmJkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsZil7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxXazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxGaTpmdW5jdGlvbigpe2smJmsuUz9mLnRyYWNrKCJzdGF0c19oZF9wbGF5aW5nX3N1bSIsay5FYiwhMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZpKCl9LmJpbmQodGhpcyksNTAwKX0sRWk6ZnVuY3Rpb24oYil7ayYmay5TP2suRWImJmYudmMoWyJzdGF0c19oZF9lcnJvcmNvZGU6IitiLCJzdGF0c19oZF9lcnJvcmNvZGVfc3VtIl0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FaShiKX0uYmluZCh0aGlzKSw1MDApfX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPQpiW2ddO3JldHVybiBkfTthLnluPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTthLmhuPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVwPXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIiwKbmFtZToiYWRNaWRQb2ludCJ9O2Eudmc9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTthLkhrPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTthLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuYXA9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS52cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2EuS2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07YS51bD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2Eud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5JYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9OwphLnJlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTthLnRlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07YS5Jaz17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5sbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudHA9Cntjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlhvPXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGw9Yy5wanx8bDtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYudm09YTthLnByb3RvdHlwZT0Ke319KShjKTt2YXIgamE9Yy52bXx8amE7bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5yaj1hO2EucHJvdG90eXBlPXtUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZyxmO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoZj1iLmxlbmd0aDtkPGY7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxkbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrCiIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLkVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfSx5bTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhKCkrIjIifSx4aDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLlRlKHRoaXMuZG0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fQp2YXIgYj0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87YS5leHRlbmQ9ZnVuY3Rpb24oZSl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZz1PYmplY3QuY3JlYXRlKGQpLGY7Zm9yKGYgaW4gZSlnW2ZdPSJmdW5jdGlvbiI9PT10eXBlb2YgZVtmXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbZl0mJmIudGVzdChlW2ZdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGYsZVtmXSk6ZVtmXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2YuWmk9YX0pKGMpO3ZhciBLPWMuWml8fApLO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxhPWMuRmt8fGxhO25ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5NYT17fTt0aGlzLkc9bnVsbDt0aGlzLlljPTEwMDt0aGlzLlViPTA7dGhpcy5WYT0xNTA7dGhpcy4kYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlViPD10aGlzLlZhPyh0aGlzLlViKyssdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSk6MD50aGlzLlZhJiYodGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSl9LFluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWI+CnRoaXMuVmE/ITA6ITF9LHpmOmZ1bmN0aW9uKCl7dGhpcy5VYj0wfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sZW86ZnVuY3Rpb24oYSl7dGhpcy5HPWF9LGJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sTjpmdW5jdGlvbihhKXt0aGlzLk1hW2Eua2EoKV09YTtMJiZMLkRoJiZMLkFvKGEpfSxmcTpmdW5jdGlvbigpe3JldHVybiBmLlJlKHRoaXMuTWEpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9CnRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLlljPTEwO3RoaXMuVWI9MDt0aGlzLlZhPTUwO3RoaXMuWD1udWxsO3RoaXMuaGE9ITE7dGhpcy5wbGF5ZXI9YTt0aGlzLk5iPSIiO3RoaXMuUWc9ITE7dGhpcy5KKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGdxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0saG86ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSxlcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVWI8PQp0aGlzLlZhJiYodGhpcy5VYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLHRoaXMuWWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuaWQ9YX0seXE6ZnVuY3Rpb24oKXt9LFc6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1hO3RoaXMucW0oKXx8dGhpcy5MaygpO3RoaXMuUWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxocTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApZZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmN1cnJlbnRUaW1lP2EuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk5iPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmJ9LApZaDpmdW5jdGlvbigpe3RoaXMuTmI9bnVsbH0sanE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLk5iJiYoYT0hMCk7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITApfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy52aWRlb1RhZztiJiZiLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkNrPSIzIjt0aGlzLmhkPTA7dGhpcy5ibj0zMDt0aGlzLmRjPVtdO3RoaXMub2I9W107dGhpcy55Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPQohMTt0aGlzLnN0YXR1cz10aGlzLmhkO3RoaXMuaWQ9Zi5WKDEwKTt0aGlzLkZmKGEpO3RoaXMuZm8oYil9LGY6ZnVuY3Rpb24oKXt9LGphOmZ1bmN0aW9uKCl7dGhpcy53aXx8KHRoaXMud2k9ITAsZi5qZigpKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlIoKTtRJiZRLnBjJiYhbWEmJihtYT0hMCxmLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLm1jKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5tYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKSxiPSEwLGU9bmV3IEk7d2luZG93W2UuZ2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0uaW5pdGlhdG9yIT1mLm1jKCkmJih0aGlzLkdmKCksYj0hMSk7cmV0dXJuIGJ9LEM6ZnVuY3Rpb24oYSxiKXt2YXIgZT0hMDthJiYoZT0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy54bSgpO2lmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5kYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5kYyYmMDx0aGlzLmRjLmxlbmd0aCYmCih0aGlzLmRjPWYudW5pcXVlKHRoaXMuZGMpLGYudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLmRjLmpvaW4oIiwiKSkpO2lmKHRoaXMub2Ipe2Zvcih2YXIgZT0wO2U8dGhpcy5vYi5sZW5ndGg7ZSsrKXRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPT10aGlzLnljW2FdJiZiLnB1c2godGhpcy5vYltlXS5kZXRhaWwpLHRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPHRoaXMueWNbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy55Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuQ2t9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZH0sb2c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLmtnfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5oZH0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihmKXtmLmZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPWEuUnA7Yj9iLnBhP2IucGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7dmFyIGE9ITEsZz0iIjtiLmdldEVycm9yJiYoYT1iLmdldEVycm9yKCkpO2F8fGIuZGV0YWlsLmdldEVycm9yJiYoYT1iLmRldGFpbC5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZSYmKGcrPWEuZ2V0RXJyb3JDb2RlKCkpO2EuZ2V0TWVzc2FnZSYmKGcrPWEuZ2V0TWVzc2FnZSgpKTtnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5nanx8cGE7KGZ1bmN0aW9uKGYpe2YuaGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuTGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkxqfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5uaD10aGlzLnhiPSExO3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YS5hdXRob3JpdHkmJmEuYXV0aG9yaXR5LmluZGV4T2YmJjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnRsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuOwphPXRoaXMudmlkZW9UYWcucGFyZW50Tm9kZS5wYXJlbnROb2RlfXRoaXMuVChhKX0sTGU6ZnVuY3Rpb24oKXtpZighdGhpcy54Yil7dmFyIGE9dGhpcy5OaCxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fCh0aGlzLnhiPSEwKTt0aGlzLlcoYil9fSxOYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmCjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe2IuZHVyYXRpb24mJmIucG9zaXRpb24mJjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LGxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTsKYi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5tZiYmKDAsdGhpcy5tZikoKX0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKCFhLmdldFN0YXRlfHwicGxheWluZyIhPWEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiYKYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxsYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGI9ITE7YS5nZXRWb2x1bWUmJmEuZ2V0Vm9sdW1lKCkmJihiPWEuZ2V0Vm9sdW1lKCkpO3JldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQWp8fHNhOyhmdW5jdGlvbihjKXtjLnpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuc2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLkhiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5IYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkhiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5IYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkhiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7Zm9yKHZhciBkPSJhZFBsYXkgYWRDb21wbGV0ZSBhZENsaWNrIGFkSW1wcmVzc2lvbiBhZE1ldGEgYWRTa2lwcGVkIGFkVGltZSIuc3BsaXQoIiAiKSxlPTA7ZTxkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuSGI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLmkoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChldmVudC5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpO2Eub24oInBsYXlsaXN0aXRlbSIsZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS50bD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTmI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/CnRoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnNlJiZ0aGlzLmkoKSl9LFltOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuS2U/dGhpcy5LZSsrOnRoaXMuS2U9MTp0aGlzLkplP3RoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy56anx8dGE7KGZ1bmN0aW9uKGMpe2MuQmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWWwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPQpbXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLnhifHx0aGlzLk0oZSl8fHRoaXMuRW0oZSl8fCh0aGlzLk4oZSksZT1uZXcgdGEoZSx0aGlzLkcpLGUuSigpLGUuZigpKX19dGhpcy5QKCl9fSxicTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxZbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQmp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkNsfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Yuc2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksCmE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFllOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5UYigxMCk7dGhpcy5WZj0hMDt0aGlzLkRjPXRoaXMudWg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmNsKCksdGhpcy56YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuRCgidC1vbmxpbmUuZGUiKT8KITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuSD9hLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYS5IJiZhLkguSWE/YS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkgmJmEuSC5JYT90eXBlb2YgYS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5wZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLAphLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5wYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueWU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9CnRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy50aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLlJuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkRjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkVjPSEwO2lmKGYuRCgiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmCmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5FY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxhcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGNsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0sCnpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkRjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGM/dGhpcy53KCk6KHRoaXMuZGEoITApLAp0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnVoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwKKGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGRsOmZ1bmN0aW9uKCl7dGhpcy5KY3x8KHRoaXMuSmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihhLmFkcyl7aWYodGhpcy5KYyE9YS5hZHMuc3RhdGUmJih0aGlzLkpjPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRsKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYKMTAwOT09dGhpcy5LKXJldHVybiEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl7dmFyIGE9ITE7Zi5UYygiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYil7Yj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVWwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fAoodGhpcy5WZj0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkModGhpcy5WZixmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbmw6ZnVuY3Rpb24oKXt0aGlzLmtxfHwoMTA8dGhpcy5ncD8odGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmdwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sWG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaHApe3RoaXMuaHA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMucmt8fHlhOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2VdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmCihhPWEucGxheWVyLnBsYXllcigpLGIucHVzaChhKSk7aWYoMDxmLlJlKGIpKXtmb3IodmFyIGUgaW4gYiliLmhhc093blByb3BlcnR5KGUpJiYoYT1uZXcgeGEoYltlXSksYS5oYXx8dGhpcy5NKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYSksKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLkFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5Bbnx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3RoaXMuc2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LEJuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTmIsZT10aGlzLmthKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLnBjJiYoMDw9ZS5pbmRleE9mKGQpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmCmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLlVqfHxSOyhmdW5jdGlvbihmKXtmLlRqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8KHRoaXMuUGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5QYisrLDE1PHRoaXMuUGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sCmVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmYihlLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCnRoaXMuSyk7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMuS2w9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5CbihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihmKXtmLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9CjE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPAphLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGU9bmV3IFIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgQ2EoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVmp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm1ufHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkRuPQphLnBvc2l0aW9uaW5nO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUud2lkdGg9YS53aWR0aDtlLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZS5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Uuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuRG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGUpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGIpfXRoaXMuVChlKTt0aGlzLlcoZSk7dGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLkNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DZCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1sOmZ1bmN0aW9uKCl7Zi56aCh0aGlzLkNkKTtmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTsKaWYoZi56aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLk0oYSkpKXt0aGlzLk4oYSk7KG5ldyBJYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Ibj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuSG58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSxNazpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5HaT0hMTt0aGlzLkxoPWQ7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmsmJmsuY2YodGhpcy5GYS51cmwpJiYhYyYmCihjb25zb2xlLmxvZygidGVzdDEiKSxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsInN0YXR1czAiLCEwKSk7ZyYmNCE9aC5yZWFkeVN0YXRlJiZnKGgpfS5iaW5kKHRoaXMpfWMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksayYmay5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTprLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLiRpPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxWbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYiwKYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17QXA6IkFkQ2xpY2tUaHJ1IixDcDoiQWRFcnJvciIsRHA6IkFkU3RvcHBlZCIsR3A6IkFkTGluZWFyQ2hhbmdlIixIcDoiQWRUYWdQYXJzZWQiLEtwOiJBZFZpZGVvQ29tcGxldGUiLE5wOiJBZExvYWRlZCIsT3A6IkFkU2tpcHBlZCIsUHA6IkFkU3RhcnRlZCIsRXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixGcDoiQWRJbXByZXNzaW9uIixCcDoiQWRDcmVhdGl2ZVZpZXciLElwOiJBZFZpZGVvTWlkcG9pbnQiLEpwOiJBZFBhdXNlZCIsTHA6IkFkVmlkZW9TdGFydCIsTXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5sZSxhW2RdKX0sVW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKCl7fSl9aWYodGhpcy5HYSYmdGhpcy5HYS5rZSlmb3IodmFyIGEgaW4gdGhpcy5HYS5rZSl0aGlzLkdhLmtlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuVm4oKTt0aGlzLkdhJiZ0aGlzLlVuKCl9fX0pKGMpO3ZhciBOYT1jLiRpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZmM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5XYj0iIjt0aGlzLmllPQoic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5iYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5YYj0iIjt0aGlzLlliPVtdO3RoaXMuWmI9W107dGhpcy5jZD1bXTt0aGlzLnVjPSIiO3RoaXMuSWI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm9jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMuRWI9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5GYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9CiExO3RoaXMuWmM9dGhpcy5QZD1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmZjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlFjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5XYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLApIT01BRF9BREJMT0NLRVI6dGhpcy5iYyx0ZXN0SGlkZTp0aGlzLlhiLHRlc3RUYWdzOnRoaXMuWWIsdGVzdFRhZ3NKUzp0aGlzLlpiLHRlc3RUYWdzWEhSOnRoaXMuY2QsdGVzdDNQQ29va2llOnRoaXMudWMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm9jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5FYixibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkZjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCwKYWRGYWxsYmFja0NvbmZpZzp0aGlzLmtkLHlpZWxkbGFiOnRoaXMuRGJ9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJgoodGhpcy5UZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUWM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuV2I9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5iYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuWGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYKKHRoaXMuWmI9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYodGhpcy5jZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudWM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm9jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLkViPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnNkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9CmIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLktmPWIuc2tpcEFsbG93ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxwbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09CiEwfSxabDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuV2soYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIiwKZj0iIixjPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuYmYoYik7Zj10aGlzLmFhKGIpO2c/KHRoaXMuU2MoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucmMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5mY3x8dGhpcy5xZCkmJihoPXRoaXMuZG4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5hbShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhkPWQuZXhlYyhiKSkmJihkWzJdfHxkWzVdKT9hPSEwOnRoaXMuU2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhiKSkmJmRbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFNjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYW06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihkIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2RdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuV3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxyYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYKKGE9ZC5mYWxsYmFjayk7cmV0dXJuIGF9LGNuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgbD1oW0JdLnNwbGl0KCI9Iik7Z1tsWzBdXT1sWzFdfWZvcih2YXIgayBpbiBhW2NdLnN1YnZhbHVlcylnW2tdPXRoaXMuSGgoZ1trXSxrLGFbY10uc3VidmFsdWVzW2tdKTtoPVtdO2ZvcihrIGluIGcpaC5wdXNoKGsrIj0iK2dba10pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9az1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWsucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sZG46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmZjJiYoYj10aGlzLmNuKGIsdGhpcy5mYykpO3JldHVybiBifSxsbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5mbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxmbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEua28oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmpvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxmLGMpe2s9dGhpczt0aGlzLmRmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1kO3RoaXMuY2U9Zzt0aGlzLmpjPWY7dGhpcy55YT1jfHx7fTt0aGlzLmxsKCk7dGhpcy5UbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlJtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5IYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkhjKCl9Y2F0Y2gobCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGQpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSx5bDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sVG06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUWMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMubm0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuSGMoKX0uYmluZCh0aGlzKSwhMCl9LFJtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlRiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChlKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmpjPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5qYz0hMSk7dGhpcy5qYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmpjP3RoaXMuamMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuTGMobC55bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbm06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5XYnx8dGhpcy5BYXx8dGhpcy5IYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxIYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5EKCJ3ZWIuZGUiKXx8Zi5EKCJnbXgubmV0Iil8fGYuRCgiZ214LmF0Iil8fGYuRCgiZ214LmNoIil8fGYuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLldiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5WZT1kLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLldiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucmMoKSksZD10aGlzLmFhKHRoaXMuV2IpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuV2IrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZT1hLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7aWYoIXRoaXMub2MmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm9jPSEwO3RoaXMuVWMoITApOwpyZXR1cm59fWU9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihlPSEwKX1jYXRjaChoKXt9aWYoIShlfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihkLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlhiPWQudGVzdGhpZGV8fCIiO3RoaXMuWmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5jZD1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudWM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5mYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZC5qc3BvcHVwc3x8ITE7dGhpcy5BYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkZjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWQueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1kLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm9jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5vYz0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLk9vKCkmJih0aGlzLlhifHx0aGlzLlpifHx0aGlzLllifHx0aGlzLmNkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuR28oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFhtOmZ1bmN0aW9uKGEpe3RoaXMuSGk9ITA7dmFyIGU9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZT10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZSkpLGU9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmUsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihlKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuVGModGhpcy5yYygpLCJQT1NUIixlLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBlPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztlPWUucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGUsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitlKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGUsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy5FYj0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0sRm86ZnVuY3Rpb24oKXtpZih0aGlzLlhiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5iYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuWGIpO2Uuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5YYik7ZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpOwphPWR9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKCkpLHRoaXMuS28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLlhkKHRoaXMuYmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5ZYj10aGlzLmNkKSYmdGhpcy5ZYi5sZW5ndGgpe3ZhciBkPXRoaXMuWWIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxLbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2YoKSYmZSgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZCgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5UYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGUuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBlKCl7dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlpiJiZ0aGlzLlpiLmxlbmd0aCl7dmFyIGQ9dGhpcy5aYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LExvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihlLGQpe2Q9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnVjKXRyeXtmLlRjKHRoaXMudWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSWI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixlPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLkViJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5ZaygpO3RoaXMudWMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5JYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLklifSl9LFlrOmZ1bmN0aW9uKCl7dGhpcy5aYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlpjLmlkPWYuVigxMCk7dGhpcy5aYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWmMpO3ZhciBhPXRoaXMuWmMuY29udGVudFdpbmRvdyxlPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5QZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxrbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucG0oKSl7dmFyIGE9dGhpcy5abCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGUsZCxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuR2k9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGdsOmZ1bmN0aW9uKCl7dGhpcy4kbXx8KHRoaXMuJG09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoZz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5TYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChlKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChlKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSxFbzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30saWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuJG8uYmluZCh0aGlzKSx0aGlzLlpvLmJpbmQodGhpcykpfSwkbzpmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbDt0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuSmwoKX0sWm86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5MYyhsLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuQWJbYV07InJlcXVlc3QiPT1lLnR5cGUmJmYuZWIoZS51cmwsZS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1lLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmdhKCldPXRoaXM7Zi5lYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxUYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPQoiIixkPTA7ZDxhO2QrKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZX0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPSIiLGQsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGV9LGFhOmZ1bmN0aW9uKGEpe3ZhciBlPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2VbZ11dPWFbZ118fCIiO2QucXVlcnlLZXk9e307ZFtlWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGUpe2ImJihkLnF1ZXJ5S2V5W2JdPWUpfSk7cmV0dXJuIGR9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9IiIsZSxkO2ZvcihlPTc7MDw9ZTtlLS0pZD1hPj4+NCplJjE1LGIrPWQudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChuJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGYsNSkrKG4mcHx+biZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWQoZiw1KSsobl5wXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1kKGYsNSkrKG4mcHxuJnJ8cCZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZChmLDUpKyhuXnBecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2Esaz1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Daj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuQ2p8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMua2M9dGhpcy5yZD0hMTt0aGlzLlVrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuWGs9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5vZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Taz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlhjPXRoaXMuVGQ9ITE7dGhpcy5GaD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLnBjPSExO3RoaXMudmw9Zi5WKDEwKTt0aGlzLlNiPWYuVigxMCk7dGhpcy5RYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy5hYz10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMueGM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Qbz10aGlzLkdiPXRoaXMuUmI9ITE7dGhpcy5CYz1bXTt0aGlzLnFjPXt9O3RoaXMudm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkdjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGU9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZX0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuT2ImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLndvKCk7Zi5vKGwuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxlLGQsZyl7dGhpcy5HYj0KZDt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5rbCgpLGc9ay5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLmFvKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZSxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZSxkKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy5hYz10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5xbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5CYz10aGlzLmFoKGEpO3RoaXMub2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMuam0oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGU9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZT10aGlzLmFoKGIucGFyZW50KSksZS5wdXNoKHRoaXMuVGwoYikpKTtyZXR1cm4gZX0sVGw6ZnVuY3Rpb24oYSl7dmFyIGU9IiIsZD1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2U9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylkLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDplLGNyZWF0aXZlSUQ6ZH19LGptOmZ1bmN0aW9uKGEpe3ZhciBlPVtdLGQ9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGUubGVuZ3RoO2grKylkLnB1c2goYS51YihlW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZT0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGU9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZT1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTplPT1GLm1lLmNvZGU/Zi5vKGwudXAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGU9PUYuaGcuY29kZSYmZi5vKGwuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGwuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnhvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSWImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5JYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhsLmFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8obC52cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhsLndwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8obC5obix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8obC5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8obC5Zbyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMubGMoYSk7dGhpcy5SYSgpfSxsYzpmdW5jdGlvbihhKXt2YXIgZT05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZT1hLmVycm9yLmNvZGUsOTAxPGUmJihlPTkwMCkpO2ZvcihlPXsiW0VSUk9SQ09ERV0iOmV9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLmdmKGQudXJsLGQudHlwZSxlKX1jYXRjaChnKXt9fSxxbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBlPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGU9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1lO2U9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2QmJmQuZW52dmFycyYmKGc9ZC5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRmQmJihnPWQuRmQoKSk7Zy52aWRlb1Nsb3QmJihlPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31lLnZxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihlLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZS5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZS5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5TayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGUudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZS5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZSxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLndmJiZlLmxvYWQoKTtpZih0aGlzLm1pKGUpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGUpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWU6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpfWNhdGNoKGspe3RoaXMudmlkZW89CmV9fWVsc2UgdGhpcy5iLnJsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxvbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnhjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGwuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlJrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVmIoIm11dGVkIiwiY29udGVudCIpO2YubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRix0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5tbSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGsuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRiwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8obC5JYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5uYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5CYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmpwKCksdGhpcy5hLm5jKCEwKSwhdGhpcy5hYykpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5hYz17ZWw6dGhpcy5GLGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8obC5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubmMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5uYyghMCksdGhpcy5ycCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5wcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm9wKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhsLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5GY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMua3AoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnRjKCkpLHRoaXMubHAoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlZiKCJtdXRlZCIsInVzZXIiKSxmLm8obC5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVmIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGwuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGwudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkYsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxrcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnhjPSEwfSxscDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54Yz0hMX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8obC51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8obC50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHBwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhsLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sb3A6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGU9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7Zi5EZSgpO3RoaXMuRj0hMTt0aGlzLlJhKGEpfX0saXA6ZnVuY3Rpb24oYSl7dmFyIGU9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZSYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZT1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZS5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhsLnRwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApOazpmdW5jdGlvbihhLGUpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuU2MoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZChlLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuZnAuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChlLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmtjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2N8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuVWspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlJiJiYhdGhpcy5rYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUmJ8fCh0aGlzLlJiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGUpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuY3AoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuYnAoKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLnZpZGVvLnBsYXkoKTtpZihlJiZlWyJjYXRjaCJdKWVbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5zYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnNjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8obC5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPVtdLGQ9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWQ9Zi5maChhW2ddKSxlLnB1c2goZCk7YT17aGFzaGVzOmV9O2E9bC5UYShhLHRoaXMudSgpKTtmLnVvKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Layh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhsLmxuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkZifHx0aGlzLmIuemMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmtjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZSl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5wYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRmImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIuemMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSxmcDpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmtjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5nbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5wYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhsLkljLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlNvKGEpO2lmKCF0aGlzLmFjKXt2YXIgZT0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuYWM9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhsLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmUscGVyY2VudDpkLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX1kPSIiO3RoaXMuYi5MZiYmKGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuTGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhsLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkZiPyh0aGlzLmtjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxlLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFNvOmZ1bmN0aW9uKGEpe2YubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5SYnx8KDA9PWEmJih0aGlzLkdiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLkdiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5JYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSWIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5SYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGwudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8obC5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGUpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZSwhMCl9LHdvOmZ1bmN0aW9uKCl7Zi52YyhbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YudmMoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtmLnZjKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi52YyhbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFZiOmZ1bmN0aW9uKGEsZSl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZSwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZSl7aWYoIXRoaXMuUmIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5rbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGM9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkdjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGwuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZSl0cnl7dGhpcy5iLlBhPXRoaXMuemwodGhpcy5iLlBhLGEpfWNhdGNoKGspe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZT0iIjt0aGlzLmNnJiYoZT0iX3ZwYWlkIik7dGhpcy5kZCYmKGU9Il93ZWxlY3QiKTtyZXR1cm4gYStlfSxnZjpmdW5jdGlvbihhLGUsZCxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihlPXRoaXMuQS53YShhKSxkJiZlLk1rKGQpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuT2soYSksdGhpcy5BLkxhKGUsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE9rOmZ1bmN0aW9uKGEpe3RoaXMucWNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5xY1thXT0iY2xvc2VkIn0sb2w6ZnVuY3Rpb24oKXt0aGlzLnFjPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZTtmb3IoZSBpbiB0aGlzLnFjKXRoaXMucWMuaGFzT3duUHJvcGVydHkoZSkmJiJvcGVuIj09dGhpcy5xY1tlXSYmYSsrO3JldHVybiBhfSxrbTpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1lfSl9LHpsOmZ1bmN0aW9uKGEsZSl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1lfSl9LGNwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy50YygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGUpe31mLm8obC5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRmN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZSl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxicDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBlPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGU9dGhpcy5BLnRkKTtlJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLktiLmJpbmQodGhpcyksMUUzKmUpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sS2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMudmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuU2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlFiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Sby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5MYigpO3RoaXMuS2IoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZkLmFwcGVuZENoaWxkKGgpO2QuYXBwZW5kQ2hpbGQoYyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuTGIoKTt0aGlzLktiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUud2lkdGg9IjEwMCUiLGUuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGUuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGUuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLAplLnN0eWxlLmJvdHRvbT0iMHB4IixlLnN0eWxlLnpJbmRleD0iMTAwMDAiLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmUuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGUpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhsLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLkxiKCl9fSxMYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHRjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlNiKTt0aGlzLnhjPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMueGM9ITEpOihmLm1hKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy54Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGwucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwidXNlciIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVmIoIm11dGVkIiwidXNlciIpLGYubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5WYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGwuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5RYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxzYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5zYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEuRWJ8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuT2ImJnRoaXMuVG8oKXx8KHRoaXMueWQ9ITAsdGhpcy5HYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5HYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGU9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixkPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZStkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZT1rLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGN8fChhPQohMCxlLmFkRmFsbGJhY2tVUkx8fChlLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkdjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuR2M/ImFueSI6IiIpKyhlLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5YYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuR2MmJmUuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhjfSwkbDpmdW5jdGlvbigpe3ZhciBhPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxlPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1lLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZS5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmUuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBlPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuJGwoKTt0aGlzLkdjPXRoaXMuWGM9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBlPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2UsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy52bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlpuKCksdGhpcy5wYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhsLnVsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5GYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5CYyYmMDx0aGlzLkJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5CYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5YaysiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5Fa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtlPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy5BYz10aGlzLkNjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGUsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGU9IiI7Yi5xdWVyeUtleSYmKGU9Yi5xdWVyeUtleS5odnApO2UmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmsud2Eoay5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihmLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuRCgiZmFuZG9tLmNvbSIpfHxmLkQoImdpZ2EuZGUiKXx8Zi5EKCJraW5vLmRlIil8fGYuRCgic3BpZWxldGlwcHMuZGUiKXx8Zi5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuRCgiZ2lnYS5kZSIpfHxmLkQoImtpbm8uZGUiKXx8Zi5EKCJzcGllbGV0aXBwcy5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxsKCl8fG0oKXx8ImFwcHNwb3QiPT1lKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChrLldkKGgpKSsiJnR5cGU9anMiLGI9ay53YShrLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9ay53YShrLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9ay5MYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixlKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk9iKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtlW2JdPXt9fWVsc2UgZS5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBlPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5PYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuT2J8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGsuRW8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZDtlLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWUucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZSk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxlPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1lPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkpuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5XYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGUpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuV2MoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFdjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxlLHtBZFN5c3RlbTp0aGlzLlNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlZvKCkmJnRoaXMudGYodGhpcy54bCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5DYz8odGhpcy5DYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuV2MoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLkFjPyh0aGlzLkFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLldjKCkpOnRoaXMucGFyZW50LkloKCl9LFZvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLk5jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRmI9YS5GYj9hLkZiOnRoaXMuQ2M7YS56Yz1hLnpjP2EuemM6dGhpcy5BYzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3RoaXMucGFyZW50LnRmKGEpfSx4bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk5jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuVmwoKTthLkNxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUmwoKTthLkxmPXRoaXMuaW0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZT0hMTsoZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZlLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLldsKCkpOmEuUGEuY29uY2F0KHRoaXMuZW0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5sYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmxjJiZ0aGlzLnBhcmVudC5sYyhhKSxiPTAsdGhpcy5XYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxsYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5sYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGU9bmV3IFRhKGEsYik7ZS5vcmlnaW49dGhpcztyZXR1cm4gZX0sTW86ZnVuY3Rpb24oKXtyZXR1cm4gYjxlfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5OYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxKbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZSl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFNsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGQ9YVtlXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZCYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZSl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspYi5wdXNoKHtpZDphW2VdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZV0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtlXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2VdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZV0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxYcDphW2VdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2VdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxSbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZT0hMSxkPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZT1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2U9Yn1kLnB1c2goZSk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZCxoPWMpOihiPWUsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGltOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGU9ITEsZD0hMTt0cnl7ZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9ZS5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYudG8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5hbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMuemM9dGhpcy5GYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLldqPWE7YS5wcm90b3R5cGU9e3JsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTy5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGNtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGU9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShlPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZS5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2RdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmNtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxtbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk8ubGVuZ3RoO2UrKylpZigwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tlXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuV2p8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMubWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0seHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx5cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLk9tfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWU7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Eanx8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1lO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuZXA9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnpwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy5aaFthXSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ycT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Xbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Qbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzpkLGZyYW1lOmYsd246Yyx2ZW5kb3I6ZS5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMucWYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy5xZltlXTtkLnR5cGU9PT1hJiZkLiRrKHRoaXMuWGwoYSkpfX0sWGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7QXE6ITAsenE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7b3E6InZpZGVvIixEcToianNDdXN0b20iLEVxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRnE6MSxZcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxsbTpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMuYmUubGVuZ3RoO2UrKylpZih0aGlzLmJlW2VdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZV0ud247cmV0dXJuIiJ9LFduOmZ1bmN0aW9uKGEsZSl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5sbShlKSx2ZW5kb3I6ZX0pO3RoaXMudm8oKX0sUG46ZnVuY3Rpb24oYSxlKXsidmlkZW8iPT09YT90aGlzLmVwLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZSl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxlKX0semc6ZnVuY3Rpb24oYSxlKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKJGs6ZSx4cTohMX0pfSx2bzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLnFxKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkJxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLnNtfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuY29uZj1lfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5nYz1bXX1jLmFqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBlPXt9LGQ9ITEsYz0wLGU9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixjPWUubGVmdCxlPWUudG9wKTtmPXt4OmMseTplfTtmLnBvc2l0aW9uPWQ7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBlPTAsZD0wLGM9ITEsZj10aGlzLnVtKGEpLGg9e307YTspZSs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGUrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZSx5OmR9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSxDbzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8obC5JYyx0aGlzLmMubCgpKX0sWm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8obC53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy4kYyYmdGhpcy5jLiRjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxlJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxObDpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmdldFBvc2l0aW9uKGEpO2UucG9zaXRpb24/ZS5wb3NpdGlvbj1lLnBvc2l0aW9uOmUucG9zaXRpb249ImFic29sdXRlIjtlLndpZHRoPWEub2Zmc2V0V2lkdGg7ZS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGV9LG5jOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuTmwodGhpcy50Yik7aWYoZS54IT10aGlzLkhhLnh8fGUueSE9dGhpcy5IYS55fHxlLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxlLndpZHRoIT10aGlzLkhhLndpZHRofHxlLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZS53aWR0aCYmMD09ZS5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1lO3RoaXMuYy4kYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmUueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZS55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1lLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdGhpcy5nY1thXSh7d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5nYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5hanx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMudW58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1lKWEuY29udGFpbmVySWQ9ZS5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Qaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmVjPXRoaXMuZWN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTmI7YSYmYS5wYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZWMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZT0wO2U8Yi5tb2R1bGVzLmxlbmd0aDtlKyspe3ZhciBkPWIubW9kdWxlc1tlXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuVnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5tcSgpOiExfSxOYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTmMoKTotMX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5lYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmVjfHwzMDI9PXRoaXMuZWM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZWMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5mbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Qanx8Y2I7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy4kai5Eay5Caz93aW5kb3cuT08uJGouRGsuQmsuVHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IGNiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlJqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMucW58fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlNpfHxnYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZT1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxlPWEuZGF0YS5tZXNzYWdlKTtmLkQoIndlbHQuZGUiKSYmIXRoaXMuc24mJih0aGlzLnNuPSEwLGYuRWkoYikpOzEyMDUhPWImJig5MDA9PWImJjA8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRWcoYS5hZEVycm9yRXZlbnRzKTsKYS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe2YuRCgid2VsdC5kZSIpJiYhdGhpcy5ybiYmKHRoaXMucm49ITAsZi5GaSgpKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaGI9Yy5SaXx8aGI7KGZ1bmN0aW9uKGMpe2MuVGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxVaDpmdW5jdGlvbihhKXthPW5ldyBnYihhKTthLmhhP3RoaXMuUCgpOnRoaXMuTShhKXx8KGEuUWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLk4oYSksKG5ldyBoYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1sfHwodGhpcy5NbD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuVWgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlVoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgaWI9Yy5UaXx8aWIsVD1uZXcgaWIodCk7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgamI9Yy5RbHx8amI7bmV3IGpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmtrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYSl7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGEpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ra3x8VTsoZnVuY3Rpb24oYyl7Yy5qaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3Lm5kKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLnBuKGEpfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpOwp3Lm5kKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5vbSgpfSxwbjpmdW5jdGlvbihhKXt2YXIgYj0iIixlO2ZvcihlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSl7Yj1pc05hTihhW2VdKT8hMTphW2VdO2lmKDEwMDk9PWFbZV18fDEwMDE9PWFbZV18fDMwMz09YVtlXXx8NDAzPT1hW2VdKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2VdKWlmKGFbZV0uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbZV1bZF0pPyExOmFbZV1bZF0sMTAwOT09YVtlXVtkXXx8MTAwMT09YVtlXVtkXXx8MzAzPT1hW2VdW2RdfHw0MDM9PWFbZV1bZF0pKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufX10aGlzLm0oImFkZXJyb3IiLGIpO3RoaXMuQygpfX0pfSkoYyk7dmFyIFY9Yy5qa3x8VjsoZnVuY3Rpb24oYyl7Yy5saz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO3RoaXMuTGQmJihhPWYuQWwoYSx0aGlzLkxkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTShkKSl7dGhpcy5OKGQpO3ZhciBjPW5ldyBWKGQsdGhpcy5HKTtjLmYoKX19Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IoZT1hW2JdO2UucGFyZW50RWxlbWVudDspe3ZhciBlPWUucGFyZW50RWxlbWVudCxoPWUuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5MZHx8Cih0aGlzLkxkPVtdKSx0aGlzLkxkLnB1c2goYVtiXSksZD1uZXcgVShoKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksYz1uZXcgVihkLHRoaXMuRyksYy5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxuZDpmdW5jdGlvbihhLGIsZSl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYV18fCh0aGlzLmNhW2FdPXt9KTt0aGlzLmNhW2FdW2JdfHwodGhpcy5jYVthXVtiXT1bXSk7dGhpcy5jYVthXVtiXS5wdXNoKGUpfSxObzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVtiXSl0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGEpLHRoaXMuWW4oKSYmKHRoaXMuemYoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgZT0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihlPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtiXVtlXSYmMDx0aGlzLmNhW2JdW2VdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2JdW2VdLmxlbmd0aDtkKyspdGhpcy5jYVtiXVtlXVtkXShhKX19LG9tOmZ1bmN0aW9uKCl7aWYodGhpcy5WYylmb3IodmFyIGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5WY1thXSxlPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbZV1bZF0mJjA8dGhpcy5jYVtlXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmNhW2VdW2RdLmxlbmd0aDtjKyspdGhpcy5jYVtlXVtkXVtjXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1hLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9YS5vRXZlbnRUeXBlLmgmJncuTm8oYSl9fSl9KShjKTt2YXIga2I9Yy5sa3x8a2Isdz1uZXcga2IodCk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5FbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBsYXkoKX0pfSwKdWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLk9pfHxtYjsoZnVuY3Rpb24oYyl7Yy5QaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIithKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5QaXx8bmI7KGZ1bmN0aW9uKGMpe2MuUWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYSYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT0KYVtiXSxkPSIiO3RyeXtkPWUuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGMpe2Q9ZS5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgbWIoZCk7dGhpcy5NKGYpfHwodGhpcy5OKGYpLChuZXcgbmIoZix0aGlzLkcpKS5mKCkpfWNhdGNoKGgpe319dGhpcy5QKCl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGUgaW4gdGhpcy5NYSlpZihiPT10aGlzLk1hW2VdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5RaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFiPWMuem58fHFiO25ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy5wbHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSksdGhpcy5wbD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSmcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz1hLnNvdXJjZS5DSE9PU0VSX0FCfHwiIixoPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYywhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9pbnRlcmFjdGlvbiIsCmMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLkpnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuTm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmljfHwodGhpcy5pYz1bXSk7dGhpcy5pYy5wdXNoKGEpfSxxbDpmdW5jdGlvbigpe2lmKHRoaXMuaWMmJnRoaXMuaWMubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5pYy5sZW5ndGg7YSsrKXRyeXt0aGlzLmljW2FdKCl9Y2F0Y2goYil7fX0sRmQ6ZnVuY3Rpb24oKXtpZih0aGlzLktjKXJldHVybiB0aGlzLktjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE5uOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuTmp8fHJiOyhmdW5jdGlvbihjKXtjLk1qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5EaT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMuRGkmJih0aGlzLmkoKSx0aGlzLkRpPSEwLHRoaXMubmEoKSk7Yi5VYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSWV8fCh0aGlzLkllPTEpLHRoaXMuSWUrKywxMDA8dGhpcy5JZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTWp8fHNiOyhmdW5jdGlvbihjKXtjLk9qPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7Zi50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgZT0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspZT0KbmV3IHJiKGFbZF0pLHRoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IHNiKGUsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciB0Yj1jLk9qfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlRrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdmI9Yy52a3x8dmI7KGZ1bmN0aW9uKGMpe2MudWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LExuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMuRGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuTG4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuRGMpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5oYltiXSYmMzAzIT10aGlzLmhiW2JdJiY0MDMhPXRoaXMuaGJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLmphKCk7CmVsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy51a3x8d2I7KGZ1bmN0aW9uKGMpe2Mud2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBlPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuTShlKXx8LTE9PWUuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihlKSwobmV3IHdiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB4Yj1jLndrfHx4Yix5Yj1uZXcgeGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgemI9Yy5HbHx8emI7bmV3IHpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmRrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnVmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5DbigpfS5iaW5kKHRoaXMpLDUwMCl9LENuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnVmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LHlvOmZ1bmN0aW9uKCl7dGhpcy51Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuZGt8fEFiOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5abT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMud2N8fCh0aGlzLndjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLndjfHx0aGlzLndjKyssdGhpcy53Yzw9dGhpcy5abT8odGhpcy53YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkueW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuY2t8fEJiOyhmdW5jdGlvbihjKXtjLmVrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBCYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIENiPWMuZWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkZsfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5iaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE5hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5ia3x8RmI7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVWEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5RbSgpOnRoaXMuR2coKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxzbDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sUW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpiKCk7IWEucGEmJmEuWSYmYS5TcCYmYS5VcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEdnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgZTthOnthPWEuZ2V0RXJyb3IoKTtmb3IoZSBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtlXSl7ZT1hW2VdO2JyZWFrIGF9ZT12b2lkIDB9MTAwOT09ZXx8MzAzPT1lfHw0MDM9PQplPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGUpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5KYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5VYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sbnE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSmIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuYWt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0samw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IEdiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLmpsKGFbYl0pO3RoaXMuUCgpfX0pO2MuZ2QuSmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBkPQpiW2VdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0mJmJbZV0uZmVybW9kJiZhLnB1c2goYltlXS5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy52anx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sJGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVWE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLkpqfHxYOyhmdW5jdGlvbihjKXtjLklqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnZmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMudmY9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGU9YS5wbGF5ZXJDb250YWluZXI7ZSYmdGhpcy52ZiYmZSE9dGhpcy52Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLkQoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLnNxKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSWp8fFk7KGZ1bmN0aW9uKGMpe2MuS2o9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLAplPWIubGVuZ3RoLGQ9MDtkPGU7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLnpmKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBHLEtiPWMuS2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5ZaXx8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubWo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxlPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksZT1hLkdldEVsKCksYiYmZT8odGhpcy5UKGUpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5tanx8TmI7KGZ1bmN0aW9uKGMpe2MubGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxCZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksZT0wO2U8Yi5sZW5ndGg7ZSsrKXRoaXMuaGFuZGxlRXJyb3IoYltlXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLmxqfHxPYjsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgTmIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgT2IoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFBiPWMubmp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmJqfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGU9ITE7YT8oZT1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZlPyh0aGlzLlQoZSksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuVml8fFNiOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy5XaXx8VGI7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGU9bmV3IFNiKGFbYl0pO2UuaGF8fHRoaXMuTShlKXx8KHRoaXMuTihlKSx3aW5kb3cuYnJpZHBsYXllcj1lLChuZXcgVGIoZSx0aGlzLkcpKS5mKCkpfX10aGlzLlAoKX19KX0pKGMpO3ZhciBVYj1jLlhpfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMubm58fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSwkZDpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LE1uOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuemt8fFhiOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmhjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0saGM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkdrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuR2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmhjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuUW4oKX0sUW46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5Lbj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5Lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmhjKGEpKX19KX0pKGMpO3ZhciBZYj1jLnlrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhLk1uKCksYT1uZXcgWWIoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMuQWt8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5kanx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2V8fChlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtlPyh0aGlzLlcoZSksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5lbj1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW59LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlpkKGEpfS5iaW5kKHRoaXMpKX0sWmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5va3x8TjsoZnVuY3Rpb24oYyl7Yy5uaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8Cih0aGlzLlBiPTApLHRoaXMuUGIrKywxNTx0aGlzLlBiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLm1vKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5LPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT0KYS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSYmYVtjXSYmYVtjXS5hZEVycm9yJiZhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMubmt8fE87KGZ1bmN0aW9uKGMpe2MucGs9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuemYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBiYz1jLnBrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5janx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ganx8WjsoZnVuY3Rpb24oYyl7Yy5Faj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuVGIoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy56YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx6YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRWp8fGFhOyhmdW5jdGlvbihjKXtjLkdqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGVjPWMuR2p8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLlBtfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLmpqfHxoYzsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5GZygpfSxGZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMuaWp8fAppYzsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuUCgpO3JldHVybn1pZighdGhpcy5NKGEpKXt0aGlzLk4oYSk7KG5ldyBpYyhhLHRoaXMuRykpLmYoKTt0aGlzLlAoKTtyZXR1cm59fXRoaXMuUCgpfX0pfSkoYyk7dmFyIGpjPWMua2p8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLkJsfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLkppfHxtYzsoZnVuY3Rpb24oYyl7Yy5JaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5BZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5BZS5iaW5kKHRoaXMpLDEwMCl9LEFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5JaXx8bmM7KGZ1bmN0aW9uKGMpe2MuS2k9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxUYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLlAoKTp0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBuYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5QKCl9fSl9KShjKTt2YXIgb2M9Yy5LaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuaGt8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5OZD1bXTt0aGlzLnlmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5Zaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmdtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnlmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy55ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5OZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxnbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy55ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxBbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV0uJGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5OZFthXS4kYil9fX0pKGMpO3ZhciByYz0KYy5Zanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy50bnx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGwuV28pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGwuam4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTWUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5EbHx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLk1iPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi53YigibmV3QWRkZWxpdmVyeSIpfWMuTGk9YTthLnByb3RvdHlwZT17aW86ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApjbzpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LGJvOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LGFkOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnptKCkpdGhpcy5NYi5nKHRoaXMuTWIuUWMsdGhpcy5NYi5xYSx0aGlzLk1iLnhmLGZ1bmN0aW9uKCl7dGhpcy5hZChhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTWIuamMpO2Vsc2UgaWYoay5EYiYmIWsuSGkpay5YbShmdW5jdGlvbigpe3RoaXMuYWQoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhsLkljLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5DbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLndiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTWIsaCk7bS4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmZmJiYoZD10aGlzLnBsYXllci5mZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5oZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx6bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LHNvOmZ1bmN0aW9uKCl7Zi53YigicHJlcm9sbCIpO2YuRWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuYWQoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX0scm86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRWYoInBvc3Ryb2xsIik7Zi53YigicG9zdHJvbGwiKTt0aGlzLmlvKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLmFkKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxUbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBvKHRoaXMucm8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sU2Q6ZnVuY3Rpb24oYSl7Zi53YigibWlkcm9sbCIpO2YuRWYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5hZChjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8obC53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxTbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmhvKHRoaXMuU2QuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGYoKX0sZjpmdW5jdGlvbigpe3RoaXMuc28oKTt0aGlzLnBsYXllci5sZiYmdGhpcy5TbigpO3RoaXMuVG4oKX19fSkoYyk7dmFyIGZhPWMuTGl8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy5pa3x8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFBoZVhhaWtpY2h1eGFUYWgsUGhlWGFpa2ljaHV4YVRhaCk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
148.251.51.163
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.163.51.251.148.clients.your-server.de
- Software
-
openresty/1.15.8.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 0387
|
241 B
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 3FD2
|
42 B
110 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:821::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsuNK0VN1IgdsLigZkjZDka63ykG10l36mMMMs4WafdO3bA12r5XGqhpfIMw_j1gA3AA4XexgwtDX1HPPCkYzMakQeCXfQGPIUhgTjDBd18&sig=Cg0ArKJSzPIEnoNCBEZFEAE&adk=1428895410&tt=-1&bs=1585%2C1185&mtos=1187,1187,1187,1187,1187&tos=1187,0,0,0,0&p=282,968,532,1268&mcvt=1187&rs=0&ht=0&tfs=102&tls=1289&mc=1<e=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1582885281007&dlt&rpt=99&isd=0&msd=0&ext&xdi=0&ps=1618%2C4917&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-11-1-10-10-0-0-0&tvt=1289&is=300%2C250&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&r=v&id=osdim&vs=4&uc=11&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200226
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:821::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
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
Frame CF7D
|
0
58 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:821::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gpt_2020022401&jk=3455440122878323&bg=!sLOls6tY5D00D_N0-A4CAAAAbFIAAAANmQFd1XdLDsonYFBqnM5s2tCQgPPhQ90hMSz8KBY7Dv4mOsRLz-FoqvLGFd459ImBMuKD5wN0L6vx2FEnYRKUT6e6SuJvgcYDWH8C8MiReT1ssRraT_Q6jjnsYAgfKDXwWhnSAIsohFruY9yOO4TxlSbUud5nym6-GhqpNEwrC8i25Ms0Ekj8q60V92NgOR1tJyJrPuneLwuXHkBd9jQCLtjA543suVk4XCP3sr84eHxaGUEGrEwyTIwWwBMHCC0DhOcjRJC-HXbCro78pn1hNAc2Vw60duo9tLSeDjjSyQUHcHUJ1A-TFMewO-fM51ZPhGjavTv7ZlB-shPmMUhvFx96qlVq0SRKFL2xOv3tnhxvXW0i3-5ChdMb5X5AQ_huC-vvTSCcMEswh7N3VhjGJ5o3CYl7sQzOIzgSAvtoPGSyWTZDH3XuGm1j3kD9NP2pp_6OWFB-vsmNiJuu7wnj0Q
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:821::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
|
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
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
Frame FEB0
|
0
58 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:821::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gpt_2020022401&jk=4239789644939934&bg=!VValVk5YkImyQ2VwciUCAAAAeVIAAAAOmQFdBp8rEwoZtED35UgwpxVjsFZeijcRijyCPyM7-Os5eG9svoB5JAgq3qmxBp3LAJwOlBm4qhydTB-NOKDpQeKGYgmqkIk0qSP93AU52dVeKnYJqvrmHzbs_plr7zLkCKtsFER_Qfqoe8KatxoDasr_G5cu_MTvouCyNmZCwb-3wuer29gLQHnz9Crz78ggArNd9CV_w1lnGplLbrjNyixSq40bppAo1Le9UfVPZQLh09F2SVMd3WdN-tbkW0kHV_XbuW0nSpWBLSN-DaeWrU3oLjBp1HiPzuer_UhQqeusNipUsaVVtHfpOEg9DOXbD-n-ur4BMESeHCGBm2QFynLe1O8YhX7A5lDCWYebzHmyjVHgCRGm-T-ef3X5KwHCjplfYcYbhixFi2XL9oRZzB3suCAr-elQAcEaB-65_JZWLPOBzeOAUg9wQo13cyM9dqPkPeRWxDo3JFblfH_tMg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:821::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 |
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.giga.de/2ceaaf3091fdc237c46c8d90f24de66ddd70a4ed/
Frame E10D
|
109 B
671 B
|
30ms
30ms
|
XHR
application/json |
148.251.51.163
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.giga.de/2ceaaf3091fdc237c46c8d90f24de66ddd70a4ed/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFBoZVhhaWtpY2h1eGFUYWg9UGhlWGFpa2ljaHV4YVRhaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnhuKWsueWwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsayl9KX1rLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5aaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmspeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8obC5JYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9rLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5jbyhrKTtiLmJvKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGsuQWIubGVuZ3RoKXt2YXIgYj1rLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmxvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09aztmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxrKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5aaz0hMTt0aGlzLk9iPSJzZXR1cCI7dGhpcy5iZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRm4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxtYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxGbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5FbihiLmRhdGEpfSxFbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5UYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuT2woYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy53bChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxhbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sd2w6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGY9YltxXS5zcGxpdCgiOiIpLApkPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGY9ZC5zcGxpdCgiLSIpLGQ9ZlswXSt0aGlzLmFsKGZbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscT0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtxPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHEmJihmPTEwMC9xKmQqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFRiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZT0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZSs9Zy50b1N0cmluZygxNik7cmV0dXJuIGV9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHEsZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsbD0yNzE3MzM4Nzgsaz0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcT1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO3E9YztuPWg7bT16O3k9bDt0PWs7Zm9yKGc9MDsxOT49ZztnKyspcD1kKHEsNSkrKG4mbXx+biZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9MjA7Mzk+PWc7ZysrKXA9ZChxLDUpKyhuXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTQwOzU5Pj1nO2crKylwPWQocSw1KSsobiZtfG4meXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz02MDs3OT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Yz1jK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cmw9bCt5JjQyOTQ5NjcyOTU7az1rK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShsKSthKGspKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHEsZixjLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxxPWIuY2hhckNvZGVBdCh6KyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8cT4+NixoPXEmNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKHEpJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxobDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHE9ITEsZj0hMSxjPSExLGg9ITEsej0hMSxsPSExLGs9ITE7dHJ5e2E9dGhpcy5obCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZ2M/ITA6ITF9Y2F0Y2godCl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxrPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1xO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1sO2IuaXNCbGluaz1rO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17Tmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sU2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxWazpmdW5jdGlvbigpe3JldHVybiBiLk5pKCl8fApiLlVpKCl8fGIud20oKXx8Yi5TaigpfHxiLnhrKCl8fGIuSGooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuVmsoKX0sVWw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGUpe2EmJihkLnF1ZXJ5S2V5W2FdPQplKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxobTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuT2I9Yn0sTWU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5PYjt0aGlzLnVlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnhuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5NZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1sLlRhKGEsZCkpO2EmJih4PWwuVGEoYixhKSk7ZyYmKHg9bC5UYSh4LGcpKTtxJiYoeD1sLlRhKHgscSkpO2MmJih4PWwuVGEoeCxjKSk7aCYmKHg9bC5UYSh4LGMpKTtmLkxjKHgpfSxHbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmhtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5tYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuR24oYik7aWYoYSlpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWsucmMoKTtrLndhKGIsITApO2I9ay53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtrLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFrfHwhay5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihrLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9ay5yYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7ay53YShnLCEwKTtnPWsud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ay5MYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSx2YzpmdW5jdGlvbihiKXtpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmMoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWsucmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9ay53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtrLkxhKGQpfX0samY6ZnVuY3Rpb24oKXtrJiZrLlM/ay5pc0VuYWJsZWQmJmsuaWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihmWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBjPSExO2Q9ITE7ZD10aGlzLmViKGIsYS5BYSxmLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9CiExfWMudXJsJiZjLmhhc2gmJihjPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuUGsoYyxiKTtyZXR1cm4gY30sZWI6ZnVuY3Rpb24oYixhLGQsZyxmLGMsaCx4KXt2YXIgbD1jfHxrO2M9ITA7eCYmKGM9ITEpO2lmKGwmJmwuUylpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2wud2EoYixjKTtjPWwud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWMuZGF0YVt0XT1kW3RdO3JldHVybiBsLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZCxnLGYsbCxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFRjOmZ1bmN0aW9uKGIsYSxkLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGwgaW4gaClkKz0iJiIrbCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbbF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGs9bmV3IFhNTEh0dHBSZXF1ZXN0O2sub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWsucmVhZHlTdGF0ZXx8MjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1c3x8ZyhrKTtmJiY0PT1rLnJlYWR5U3RhdGUmJjIwMCE9ay5zdGF0dXMmJjIwMSE9ay5zdGF0dXMmJmYoayl9O3RyeXtrLm9wZW4oYSxiLHgpLGsud2l0aENyZWRlbnRpYWxzPWMsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBrfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5UYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYmQpZm9yKHZhciBjIGluIHRoaXMuYmQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5iZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlVtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmJkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsZil7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxXazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxGaTpmdW5jdGlvbigpe2smJmsuUz9mLnRyYWNrKCJzdGF0c19oZF9wbGF5aW5nX3N1bSIsay5FYiwhMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZpKCl9LmJpbmQodGhpcyksNTAwKX0sRWk6ZnVuY3Rpb24oYil7ayYmay5TP2suRWImJmYudmMoWyJzdGF0c19oZF9lcnJvcmNvZGU6IitiLCJzdGF0c19oZF9lcnJvcmNvZGVfc3VtIl0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FaShiKX0uYmluZCh0aGlzKSw1MDApfX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPQpiW2ddO3JldHVybiBkfTthLnluPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTthLmhuPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVwPXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIiwKbmFtZToiYWRNaWRQb2ludCJ9O2Eudmc9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTthLkhrPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTthLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuYXA9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS52cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2EuS2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07YS51bD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2Eud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5JYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9OwphLnJlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTthLnRlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07YS5Jaz17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5sbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudHA9Cntjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlhvPXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGw9Yy5wanx8bDtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYudm09YTthLnByb3RvdHlwZT0Ke319KShjKTt2YXIgamE9Yy52bXx8amE7bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5yaj1hO2EucHJvdG90eXBlPXtUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZyxmO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoZj1iLmxlbmd0aDtkPGY7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxkbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrCiIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLkVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfSx5bTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhKCkrIjIifSx4aDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLlRlKHRoaXMuZG0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fQp2YXIgYj0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87YS5leHRlbmQ9ZnVuY3Rpb24oZSl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZz1PYmplY3QuY3JlYXRlKGQpLGY7Zm9yKGYgaW4gZSlnW2ZdPSJmdW5jdGlvbiI9PT10eXBlb2YgZVtmXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbZl0mJmIudGVzdChlW2ZdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGYsZVtmXSk6ZVtmXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2YuWmk9YX0pKGMpO3ZhciBLPWMuWml8fApLO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxhPWMuRmt8fGxhO25ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5NYT17fTt0aGlzLkc9bnVsbDt0aGlzLlljPTEwMDt0aGlzLlViPTA7dGhpcy5WYT0xNTA7dGhpcy4kYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlViPD10aGlzLlZhPyh0aGlzLlViKyssdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSk6MD50aGlzLlZhJiYodGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSl9LFluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWI+CnRoaXMuVmE/ITA6ITF9LHpmOmZ1bmN0aW9uKCl7dGhpcy5VYj0wfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sZW86ZnVuY3Rpb24oYSl7dGhpcy5HPWF9LGJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sTjpmdW5jdGlvbihhKXt0aGlzLk1hW2Eua2EoKV09YTtMJiZMLkRoJiZMLkFvKGEpfSxmcTpmdW5jdGlvbigpe3JldHVybiBmLlJlKHRoaXMuTWEpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9CnRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLlljPTEwO3RoaXMuVWI9MDt0aGlzLlZhPTUwO3RoaXMuWD1udWxsO3RoaXMuaGE9ITE7dGhpcy5wbGF5ZXI9YTt0aGlzLk5iPSIiO3RoaXMuUWc9ITE7dGhpcy5KKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGdxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0saG86ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSxlcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVWI8PQp0aGlzLlZhJiYodGhpcy5VYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLHRoaXMuWWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuaWQ9YX0seXE6ZnVuY3Rpb24oKXt9LFc6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1hO3RoaXMucW0oKXx8dGhpcy5MaygpO3RoaXMuUWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxocTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApZZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmN1cnJlbnRUaW1lP2EuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk5iPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmJ9LApZaDpmdW5jdGlvbigpe3RoaXMuTmI9bnVsbH0sanE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLk5iJiYoYT0hMCk7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITApfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy52aWRlb1RhZztiJiZiLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkNrPSIzIjt0aGlzLmhkPTA7dGhpcy5ibj0zMDt0aGlzLmRjPVtdO3RoaXMub2I9W107dGhpcy55Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPQohMTt0aGlzLnN0YXR1cz10aGlzLmhkO3RoaXMuaWQ9Zi5WKDEwKTt0aGlzLkZmKGEpO3RoaXMuZm8oYil9LGY6ZnVuY3Rpb24oKXt9LGphOmZ1bmN0aW9uKCl7dGhpcy53aXx8KHRoaXMud2k9ITAsZi5qZigpKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlIoKTtRJiZRLnBjJiYhbWEmJihtYT0hMCxmLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLm1jKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5tYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKSxiPSEwLGU9bmV3IEk7d2luZG93W2UuZ2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0uaW5pdGlhdG9yIT1mLm1jKCkmJih0aGlzLkdmKCksYj0hMSk7cmV0dXJuIGJ9LEM6ZnVuY3Rpb24oYSxiKXt2YXIgZT0hMDthJiYoZT0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy54bSgpO2lmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5kYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5kYyYmMDx0aGlzLmRjLmxlbmd0aCYmCih0aGlzLmRjPWYudW5pcXVlKHRoaXMuZGMpLGYudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLmRjLmpvaW4oIiwiKSkpO2lmKHRoaXMub2Ipe2Zvcih2YXIgZT0wO2U8dGhpcy5vYi5sZW5ndGg7ZSsrKXRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPT10aGlzLnljW2FdJiZiLnB1c2godGhpcy5vYltlXS5kZXRhaWwpLHRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPHRoaXMueWNbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy55Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuQ2t9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZH0sb2c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLmtnfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5oZH0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihmKXtmLmZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPWEuUnA7Yj9iLnBhP2IucGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7dmFyIGE9ITEsZz0iIjtiLmdldEVycm9yJiYoYT1iLmdldEVycm9yKCkpO2F8fGIuZGV0YWlsLmdldEVycm9yJiYoYT1iLmRldGFpbC5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZSYmKGcrPWEuZ2V0RXJyb3JDb2RlKCkpO2EuZ2V0TWVzc2FnZSYmKGcrPWEuZ2V0TWVzc2FnZSgpKTtnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5nanx8cGE7KGZ1bmN0aW9uKGYpe2YuaGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuTGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkxqfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5uaD10aGlzLnhiPSExO3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YS5hdXRob3JpdHkmJmEuYXV0aG9yaXR5LmluZGV4T2YmJjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnRsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuOwphPXRoaXMudmlkZW9UYWcucGFyZW50Tm9kZS5wYXJlbnROb2RlfXRoaXMuVChhKX0sTGU6ZnVuY3Rpb24oKXtpZighdGhpcy54Yil7dmFyIGE9dGhpcy5OaCxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fCh0aGlzLnhiPSEwKTt0aGlzLlcoYil9fSxOYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmCjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe2IuZHVyYXRpb24mJmIucG9zaXRpb24mJjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LGxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTsKYi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5tZiYmKDAsdGhpcy5tZikoKX0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKCFhLmdldFN0YXRlfHwicGxheWluZyIhPWEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiYKYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxsYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGI9ITE7YS5nZXRWb2x1bWUmJmEuZ2V0Vm9sdW1lKCkmJihiPWEuZ2V0Vm9sdW1lKCkpO3JldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQWp8fHNhOyhmdW5jdGlvbihjKXtjLnpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuc2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLkhiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5IYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkhiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5IYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkhiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7Zm9yKHZhciBkPSJhZFBsYXkgYWRDb21wbGV0ZSBhZENsaWNrIGFkSW1wcmVzc2lvbiBhZE1ldGEgYWRTa2lwcGVkIGFkVGltZSIuc3BsaXQoIiAiKSxlPTA7ZTxkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuSGI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLmkoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChldmVudC5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpO2Eub24oInBsYXlsaXN0aXRlbSIsZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS50bD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTmI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/CnRoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnNlJiZ0aGlzLmkoKSl9LFltOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuS2U/dGhpcy5LZSsrOnRoaXMuS2U9MTp0aGlzLkplP3RoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy56anx8dGE7KGZ1bmN0aW9uKGMpe2MuQmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWWwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPQpbXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLnhifHx0aGlzLk0oZSl8fHRoaXMuRW0oZSl8fCh0aGlzLk4oZSksZT1uZXcgdGEoZSx0aGlzLkcpLGUuSigpLGUuZigpKX19dGhpcy5QKCl9fSxicTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxZbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQmp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkNsfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Yuc2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksCmE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFllOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5UYigxMCk7dGhpcy5WZj0hMDt0aGlzLkRjPXRoaXMudWg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmNsKCksdGhpcy56YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuRCgidC1vbmxpbmUuZGUiKT8KITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuSD9hLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYS5IJiZhLkguSWE/YS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkgmJmEuSC5JYT90eXBlb2YgYS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5wZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLAphLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5wYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueWU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9CnRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy50aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLlJuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkRjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkVjPSEwO2lmKGYuRCgiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmCmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5FY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxhcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGNsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0sCnpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkRjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGM/dGhpcy53KCk6KHRoaXMuZGEoITApLAp0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnVoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwKKGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGRsOmZ1bmN0aW9uKCl7dGhpcy5KY3x8KHRoaXMuSmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihhLmFkcyl7aWYodGhpcy5KYyE9YS5hZHMuc3RhdGUmJih0aGlzLkpjPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRsKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYKMTAwOT09dGhpcy5LKXJldHVybiEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl7dmFyIGE9ITE7Zi5UYygiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYil7Yj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVWwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fAoodGhpcy5WZj0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkModGhpcy5WZixmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbmw6ZnVuY3Rpb24oKXt0aGlzLmtxfHwoMTA8dGhpcy5ncD8odGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmdwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sWG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaHApe3RoaXMuaHA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMucmt8fHlhOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2VdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmCihhPWEucGxheWVyLnBsYXllcigpLGIucHVzaChhKSk7aWYoMDxmLlJlKGIpKXtmb3IodmFyIGUgaW4gYiliLmhhc093blByb3BlcnR5KGUpJiYoYT1uZXcgeGEoYltlXSksYS5oYXx8dGhpcy5NKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYSksKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLkFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5Bbnx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3RoaXMuc2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LEJuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTmIsZT10aGlzLmthKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLnBjJiYoMDw9ZS5pbmRleE9mKGQpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmCmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLlVqfHxSOyhmdW5jdGlvbihmKXtmLlRqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8KHRoaXMuUGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5QYisrLDE1PHRoaXMuUGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sCmVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmYihlLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCnRoaXMuSyk7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMuS2w9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5CbihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihmKXtmLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9CjE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPAphLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGU9bmV3IFIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgQ2EoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVmp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm1ufHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkRuPQphLnBvc2l0aW9uaW5nO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUud2lkdGg9YS53aWR0aDtlLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZS5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Uuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuRG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGUpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGIpfXRoaXMuVChlKTt0aGlzLlcoZSk7dGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLkNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DZCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1sOmZ1bmN0aW9uKCl7Zi56aCh0aGlzLkNkKTtmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTsKaWYoZi56aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLk0oYSkpKXt0aGlzLk4oYSk7KG5ldyBJYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Ibj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuSG58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSxNazpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5HaT0hMTt0aGlzLkxoPWQ7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmsmJmsuY2YodGhpcy5GYS51cmwpJiYhYyYmCihjb25zb2xlLmxvZygidGVzdDEiKSxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsInN0YXR1czAiLCEwKSk7ZyYmNCE9aC5yZWFkeVN0YXRlJiZnKGgpfS5iaW5kKHRoaXMpfWMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksayYmay5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTprLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLiRpPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxWbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYiwKYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17QXA6IkFkQ2xpY2tUaHJ1IixDcDoiQWRFcnJvciIsRHA6IkFkU3RvcHBlZCIsR3A6IkFkTGluZWFyQ2hhbmdlIixIcDoiQWRUYWdQYXJzZWQiLEtwOiJBZFZpZGVvQ29tcGxldGUiLE5wOiJBZExvYWRlZCIsT3A6IkFkU2tpcHBlZCIsUHA6IkFkU3RhcnRlZCIsRXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixGcDoiQWRJbXByZXNzaW9uIixCcDoiQWRDcmVhdGl2ZVZpZXciLElwOiJBZFZpZGVvTWlkcG9pbnQiLEpwOiJBZFBhdXNlZCIsTHA6IkFkVmlkZW9TdGFydCIsTXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5sZSxhW2RdKX0sVW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKCl7fSl9aWYodGhpcy5HYSYmdGhpcy5HYS5rZSlmb3IodmFyIGEgaW4gdGhpcy5HYS5rZSl0aGlzLkdhLmtlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuVm4oKTt0aGlzLkdhJiZ0aGlzLlVuKCl9fX0pKGMpO3ZhciBOYT1jLiRpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZmM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5XYj0iIjt0aGlzLmllPQoic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5iYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5YYj0iIjt0aGlzLlliPVtdO3RoaXMuWmI9W107dGhpcy5jZD1bXTt0aGlzLnVjPSIiO3RoaXMuSWI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm9jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMuRWI9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5GYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9CiExO3RoaXMuWmM9dGhpcy5QZD1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmZjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlFjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5XYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLApIT01BRF9BREJMT0NLRVI6dGhpcy5iYyx0ZXN0SGlkZTp0aGlzLlhiLHRlc3RUYWdzOnRoaXMuWWIsdGVzdFRhZ3NKUzp0aGlzLlpiLHRlc3RUYWdzWEhSOnRoaXMuY2QsdGVzdDNQQ29va2llOnRoaXMudWMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm9jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5FYixibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkZjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCwKYWRGYWxsYmFja0NvbmZpZzp0aGlzLmtkLHlpZWxkbGFiOnRoaXMuRGJ9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJgoodGhpcy5UZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUWM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuV2I9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5iYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuWGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYKKHRoaXMuWmI9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYodGhpcy5jZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudWM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm9jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLkViPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnNkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9CmIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLktmPWIuc2tpcEFsbG93ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxwbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09CiEwfSxabDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuV2soYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIiwKZj0iIixjPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuYmYoYik7Zj10aGlzLmFhKGIpO2c/KHRoaXMuU2MoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucmMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5mY3x8dGhpcy5xZCkmJihoPXRoaXMuZG4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5hbShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhkPWQuZXhlYyhiKSkmJihkWzJdfHxkWzVdKT9hPSEwOnRoaXMuU2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhiKSkmJmRbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFNjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYW06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihkIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2RdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuV3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxyYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYKKGE9ZC5mYWxsYmFjayk7cmV0dXJuIGF9LGNuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgbD1oW0JdLnNwbGl0KCI9Iik7Z1tsWzBdXT1sWzFdfWZvcih2YXIgayBpbiBhW2NdLnN1YnZhbHVlcylnW2tdPXRoaXMuSGgoZ1trXSxrLGFbY10uc3VidmFsdWVzW2tdKTtoPVtdO2ZvcihrIGluIGcpaC5wdXNoKGsrIj0iK2dba10pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9az1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWsucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sZG46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmZjJiYoYj10aGlzLmNuKGIsdGhpcy5mYykpO3JldHVybiBifSxsbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5mbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxmbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEua28oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmpvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxmLGMpe2s9dGhpczt0aGlzLmRmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1kO3RoaXMuY2U9Zzt0aGlzLmpjPWY7dGhpcy55YT1jfHx7fTt0aGlzLmxsKCk7dGhpcy5UbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlJtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5IYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkhjKCl9Y2F0Y2gobCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGQpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSx5bDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sVG06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUWMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMubm0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuSGMoKX0uYmluZCh0aGlzKSwhMCl9LFJtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlRiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChlKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmpjPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5qYz0hMSk7dGhpcy5qYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmpjP3RoaXMuamMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuTGMobC55bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbm06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5XYnx8dGhpcy5BYXx8dGhpcy5IYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxIYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5EKCJ3ZWIuZGUiKXx8Zi5EKCJnbXgubmV0Iil8fGYuRCgiZ214LmF0Iil8fGYuRCgiZ214LmNoIil8fGYuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLldiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5WZT1kLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLldiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucmMoKSksZD10aGlzLmFhKHRoaXMuV2IpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuV2IrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZT1hLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7aWYoIXRoaXMub2MmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm9jPSEwO3RoaXMuVWMoITApOwpyZXR1cm59fWU9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihlPSEwKX1jYXRjaChoKXt9aWYoIShlfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihkLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlhiPWQudGVzdGhpZGV8fCIiO3RoaXMuWmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5jZD1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudWM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5mYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZC5qc3BvcHVwc3x8ITE7dGhpcy5BYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkZjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWQueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1kLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm9jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5vYz0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLk9vKCkmJih0aGlzLlhifHx0aGlzLlpifHx0aGlzLllifHx0aGlzLmNkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuR28oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFhtOmZ1bmN0aW9uKGEpe3RoaXMuSGk9ITA7dmFyIGU9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZT10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZSkpLGU9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmUsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihlKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuVGModGhpcy5yYygpLCJQT1NUIixlLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBlPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztlPWUucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGUsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitlKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGUsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy5FYj0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0sRm86ZnVuY3Rpb24oKXtpZih0aGlzLlhiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5iYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuWGIpO2Uuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5YYik7ZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpOwphPWR9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKCkpLHRoaXMuS28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLlhkKHRoaXMuYmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5ZYj10aGlzLmNkKSYmdGhpcy5ZYi5sZW5ndGgpe3ZhciBkPXRoaXMuWWIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxLbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2YoKSYmZSgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZCgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5UYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGUuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBlKCl7dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlpiJiZ0aGlzLlpiLmxlbmd0aCl7dmFyIGQ9dGhpcy5aYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LExvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihlLGQpe2Q9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnVjKXRyeXtmLlRjKHRoaXMudWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSWI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixlPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLkViJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5ZaygpO3RoaXMudWMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5JYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLklifSl9LFlrOmZ1bmN0aW9uKCl7dGhpcy5aYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlpjLmlkPWYuVigxMCk7dGhpcy5aYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWmMpO3ZhciBhPXRoaXMuWmMuY29udGVudFdpbmRvdyxlPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5QZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxrbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucG0oKSl7dmFyIGE9dGhpcy5abCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGUsZCxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuR2k9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGdsOmZ1bmN0aW9uKCl7dGhpcy4kbXx8KHRoaXMuJG09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoZz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5TYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChlKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChlKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSxFbzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30saWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuJG8uYmluZCh0aGlzKSx0aGlzLlpvLmJpbmQodGhpcykpfSwkbzpmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbDt0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuSmwoKX0sWm86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5MYyhsLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuQWJbYV07InJlcXVlc3QiPT1lLnR5cGUmJmYuZWIoZS51cmwsZS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1lLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmdhKCldPXRoaXM7Zi5lYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxUYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPQoiIixkPTA7ZDxhO2QrKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZX0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPSIiLGQsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGV9LGFhOmZ1bmN0aW9uKGEpe3ZhciBlPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2VbZ11dPWFbZ118fCIiO2QucXVlcnlLZXk9e307ZFtlWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGUpe2ImJihkLnF1ZXJ5S2V5W2JdPWUpfSk7cmV0dXJuIGR9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9IiIsZSxkO2ZvcihlPTc7MDw9ZTtlLS0pZD1hPj4+NCplJjE1LGIrPWQudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChuJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGYsNSkrKG4mcHx+biZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWQoZiw1KSsobl5wXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1kKGYsNSkrKG4mcHxuJnJ8cCZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZChmLDUpKyhuXnBecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2Esaz1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Daj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuQ2p8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMua2M9dGhpcy5yZD0hMTt0aGlzLlVrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuWGs9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5vZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Taz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlhjPXRoaXMuVGQ9ITE7dGhpcy5GaD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLnBjPSExO3RoaXMudmw9Zi5WKDEwKTt0aGlzLlNiPWYuVigxMCk7dGhpcy5RYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy5hYz10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMueGM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Qbz10aGlzLkdiPXRoaXMuUmI9ITE7dGhpcy5CYz1bXTt0aGlzLnFjPXt9O3RoaXMudm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkdjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGU9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZX0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuT2ImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLndvKCk7Zi5vKGwuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxlLGQsZyl7dGhpcy5HYj0KZDt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5rbCgpLGc9ay5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLmFvKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZSxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZSxkKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy5hYz10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5xbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5CYz10aGlzLmFoKGEpO3RoaXMub2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMuam0oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGU9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZT10aGlzLmFoKGIucGFyZW50KSksZS5wdXNoKHRoaXMuVGwoYikpKTtyZXR1cm4gZX0sVGw6ZnVuY3Rpb24oYSl7dmFyIGU9IiIsZD1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2U9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylkLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDplLGNyZWF0aXZlSUQ6ZH19LGptOmZ1bmN0aW9uKGEpe3ZhciBlPVtdLGQ9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGUubGVuZ3RoO2grKylkLnB1c2goYS51YihlW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZT0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGU9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZT1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTplPT1GLm1lLmNvZGU/Zi5vKGwudXAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGU9PUYuaGcuY29kZSYmZi5vKGwuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGwuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnhvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSWImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5JYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhsLmFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8obC52cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhsLndwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8obC5obix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8obC5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8obC5Zbyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMubGMoYSk7dGhpcy5SYSgpfSxsYzpmdW5jdGlvbihhKXt2YXIgZT05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZT1hLmVycm9yLmNvZGUsOTAxPGUmJihlPTkwMCkpO2ZvcihlPXsiW0VSUk9SQ09ERV0iOmV9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLmdmKGQudXJsLGQudHlwZSxlKX1jYXRjaChnKXt9fSxxbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBlPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGU9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1lO2U9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2QmJmQuZW52dmFycyYmKGc9ZC5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRmQmJihnPWQuRmQoKSk7Zy52aWRlb1Nsb3QmJihlPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31lLnZxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihlLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZS5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZS5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5TayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGUudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZS5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZSxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLndmJiZlLmxvYWQoKTtpZih0aGlzLm1pKGUpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGUpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWU6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpfWNhdGNoKGspe3RoaXMudmlkZW89CmV9fWVsc2UgdGhpcy5iLnJsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxvbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnhjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGwuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlJrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVmIoIm11dGVkIiwiY29udGVudCIpO2YubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRix0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5tbSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGsuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRiwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8obC5JYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5uYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5CYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmpwKCksdGhpcy5hLm5jKCEwKSwhdGhpcy5hYykpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5hYz17ZWw6dGhpcy5GLGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8obC5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubmMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5uYyghMCksdGhpcy5ycCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5wcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm9wKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhsLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5GY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMua3AoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnRjKCkpLHRoaXMubHAoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlZiKCJtdXRlZCIsInVzZXIiKSxmLm8obC5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVmIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGwuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGwudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkYsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxrcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnhjPSEwfSxscDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54Yz0hMX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8obC51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8obC50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHBwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhsLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sb3A6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGU9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7Zi5EZSgpO3RoaXMuRj0hMTt0aGlzLlJhKGEpfX0saXA6ZnVuY3Rpb24oYSl7dmFyIGU9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZSYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZT1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZS5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhsLnRwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApOazpmdW5jdGlvbihhLGUpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuU2MoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZChlLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuZnAuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChlLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmtjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2N8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuVWspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlJiJiYhdGhpcy5rYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUmJ8fCh0aGlzLlJiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGUpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuY3AoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuYnAoKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLnZpZGVvLnBsYXkoKTtpZihlJiZlWyJjYXRjaCJdKWVbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5zYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnNjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8obC5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPVtdLGQ9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWQ9Zi5maChhW2ddKSxlLnB1c2goZCk7YT17aGFzaGVzOmV9O2E9bC5UYShhLHRoaXMudSgpKTtmLnVvKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Layh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhsLmxuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkZifHx0aGlzLmIuemMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmtjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZSl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5wYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRmImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIuemMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSxmcDpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmtjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5nbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5wYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhsLkljLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlNvKGEpO2lmKCF0aGlzLmFjKXt2YXIgZT0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuYWM9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhsLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmUscGVyY2VudDpkLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX1kPSIiO3RoaXMuYi5MZiYmKGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuTGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhsLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkZiPyh0aGlzLmtjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxlLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFNvOmZ1bmN0aW9uKGEpe2YubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5SYnx8KDA9PWEmJih0aGlzLkdiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLkdiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5JYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSWIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5SYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGwudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8obC5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGUpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZSwhMCl9LHdvOmZ1bmN0aW9uKCl7Zi52YyhbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YudmMoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtmLnZjKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi52YyhbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFZiOmZ1bmN0aW9uKGEsZSl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZSwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZSl7aWYoIXRoaXMuUmIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5rbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGM9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkdjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGwuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZSl0cnl7dGhpcy5iLlBhPXRoaXMuemwodGhpcy5iLlBhLGEpfWNhdGNoKGspe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZT0iIjt0aGlzLmNnJiYoZT0iX3ZwYWlkIik7dGhpcy5kZCYmKGU9Il93ZWxlY3QiKTtyZXR1cm4gYStlfSxnZjpmdW5jdGlvbihhLGUsZCxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihlPXRoaXMuQS53YShhKSxkJiZlLk1rKGQpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuT2soYSksdGhpcy5BLkxhKGUsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE9rOmZ1bmN0aW9uKGEpe3RoaXMucWNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5xY1thXT0iY2xvc2VkIn0sb2w6ZnVuY3Rpb24oKXt0aGlzLnFjPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZTtmb3IoZSBpbiB0aGlzLnFjKXRoaXMucWMuaGFzT3duUHJvcGVydHkoZSkmJiJvcGVuIj09dGhpcy5xY1tlXSYmYSsrO3JldHVybiBhfSxrbTpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1lfSl9LHpsOmZ1bmN0aW9uKGEsZSl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1lfSl9LGNwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy50YygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGUpe31mLm8obC5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRmN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZSl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxicDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBlPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGU9dGhpcy5BLnRkKTtlJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLktiLmJpbmQodGhpcyksMUUzKmUpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sS2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMudmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuU2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlFiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Sby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5MYigpO3RoaXMuS2IoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZkLmFwcGVuZENoaWxkKGgpO2QuYXBwZW5kQ2hpbGQoYyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuTGIoKTt0aGlzLktiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUud2lkdGg9IjEwMCUiLGUuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGUuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGUuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLAplLnN0eWxlLmJvdHRvbT0iMHB4IixlLnN0eWxlLnpJbmRleD0iMTAwMDAiLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmUuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGUpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhsLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLkxiKCl9fSxMYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHRjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlNiKTt0aGlzLnhjPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMueGM9ITEpOihmLm1hKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy54Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGwucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwidXNlciIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVmIoIm11dGVkIiwidXNlciIpLGYubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5WYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGwuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5RYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxzYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5zYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEuRWJ8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuT2ImJnRoaXMuVG8oKXx8KHRoaXMueWQ9ITAsdGhpcy5HYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5HYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGU9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixkPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZStkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZT1rLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGN8fChhPQohMCxlLmFkRmFsbGJhY2tVUkx8fChlLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkdjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuR2M/ImFueSI6IiIpKyhlLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5YYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuR2MmJmUuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhjfSwkbDpmdW5jdGlvbigpe3ZhciBhPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxlPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1lLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZS5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmUuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBlPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuJGwoKTt0aGlzLkdjPXRoaXMuWGM9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBlPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2UsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy52bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlpuKCksdGhpcy5wYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhsLnVsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5GYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5CYyYmMDx0aGlzLkJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5CYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5YaysiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5Fa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtlPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy5BYz10aGlzLkNjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGUsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGU9IiI7Yi5xdWVyeUtleSYmKGU9Yi5xdWVyeUtleS5odnApO2UmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmsud2Eoay5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihmLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuRCgiZmFuZG9tLmNvbSIpfHxmLkQoImdpZ2EuZGUiKXx8Zi5EKCJraW5vLmRlIil8fGYuRCgic3BpZWxldGlwcHMuZGUiKXx8Zi5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuRCgiZ2lnYS5kZSIpfHxmLkQoImtpbm8uZGUiKXx8Zi5EKCJzcGllbGV0aXBwcy5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxsKCl8fG0oKXx8ImFwcHNwb3QiPT1lKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChrLldkKGgpKSsiJnR5cGU9anMiLGI9ay53YShrLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9ay53YShrLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9ay5MYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixlKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk9iKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtlW2JdPXt9fWVsc2UgZS5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBlPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5PYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuT2J8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGsuRW8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZDtlLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWUucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZSk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxlPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1lPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkpuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5XYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGUpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuV2MoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFdjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxlLHtBZFN5c3RlbTp0aGlzLlNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlZvKCkmJnRoaXMudGYodGhpcy54bCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5DYz8odGhpcy5DYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuV2MoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLkFjPyh0aGlzLkFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLldjKCkpOnRoaXMucGFyZW50LkloKCl9LFZvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLk5jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRmI9YS5GYj9hLkZiOnRoaXMuQ2M7YS56Yz1hLnpjP2EuemM6dGhpcy5BYzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3RoaXMucGFyZW50LnRmKGEpfSx4bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk5jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuVmwoKTthLkNxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUmwoKTthLkxmPXRoaXMuaW0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZT0hMTsoZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZlLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLldsKCkpOmEuUGEuY29uY2F0KHRoaXMuZW0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5sYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmxjJiZ0aGlzLnBhcmVudC5sYyhhKSxiPTAsdGhpcy5XYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxsYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5sYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGU9bmV3IFRhKGEsYik7ZS5vcmlnaW49dGhpcztyZXR1cm4gZX0sTW86ZnVuY3Rpb24oKXtyZXR1cm4gYjxlfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5OYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxKbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZSl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFNsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGQ9YVtlXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZCYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZSl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspYi5wdXNoKHtpZDphW2VdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZV0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtlXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2VdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZV0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxYcDphW2VdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2VdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxSbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZT0hMSxkPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZT1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2U9Yn1kLnB1c2goZSk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZCxoPWMpOihiPWUsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGltOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGU9ITEsZD0hMTt0cnl7ZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9ZS5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYudG8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5hbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMuemM9dGhpcy5GYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLldqPWE7YS5wcm90b3R5cGU9e3JsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTy5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGNtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGU9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShlPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZS5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2RdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmNtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxtbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk8ubGVuZ3RoO2UrKylpZigwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tlXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuV2p8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMubWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0seHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx5cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLk9tfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWU7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Eanx8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1lO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuZXA9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnpwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy5aaFthXSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ycT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Xbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Qbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzpkLGZyYW1lOmYsd246Yyx2ZW5kb3I6ZS5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMucWYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy5xZltlXTtkLnR5cGU9PT1hJiZkLiRrKHRoaXMuWGwoYSkpfX0sWGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7QXE6ITAsenE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7b3E6InZpZGVvIixEcToianNDdXN0b20iLEVxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRnE6MSxZcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxsbTpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMuYmUubGVuZ3RoO2UrKylpZih0aGlzLmJlW2VdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZV0ud247cmV0dXJuIiJ9LFduOmZ1bmN0aW9uKGEsZSl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5sbShlKSx2ZW5kb3I6ZX0pO3RoaXMudm8oKX0sUG46ZnVuY3Rpb24oYSxlKXsidmlkZW8iPT09YT90aGlzLmVwLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZSl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxlKX0semc6ZnVuY3Rpb24oYSxlKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKJGs6ZSx4cTohMX0pfSx2bzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLnFxKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkJxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLnNtfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuY29uZj1lfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5nYz1bXX1jLmFqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBlPXt9LGQ9ITEsYz0wLGU9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixjPWUubGVmdCxlPWUudG9wKTtmPXt4OmMseTplfTtmLnBvc2l0aW9uPWQ7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBlPTAsZD0wLGM9ITEsZj10aGlzLnVtKGEpLGg9e307YTspZSs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGUrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZSx5OmR9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSxDbzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8obC5JYyx0aGlzLmMubCgpKX0sWm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8obC53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy4kYyYmdGhpcy5jLiRjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxlJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxObDpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmdldFBvc2l0aW9uKGEpO2UucG9zaXRpb24/ZS5wb3NpdGlvbj1lLnBvc2l0aW9uOmUucG9zaXRpb249ImFic29sdXRlIjtlLndpZHRoPWEub2Zmc2V0V2lkdGg7ZS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGV9LG5jOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuTmwodGhpcy50Yik7aWYoZS54IT10aGlzLkhhLnh8fGUueSE9dGhpcy5IYS55fHxlLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxlLndpZHRoIT10aGlzLkhhLndpZHRofHxlLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZS53aWR0aCYmMD09ZS5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1lO3RoaXMuYy4kYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmUueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZS55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1lLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdGhpcy5nY1thXSh7d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5nYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5hanx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMudW58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1lKWEuY29udGFpbmVySWQ9ZS5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Qaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmVjPXRoaXMuZWN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTmI7YSYmYS5wYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZWMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZT0wO2U8Yi5tb2R1bGVzLmxlbmd0aDtlKyspe3ZhciBkPWIubW9kdWxlc1tlXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuVnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5tcSgpOiExfSxOYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTmMoKTotMX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5lYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmVjfHwzMDI9PXRoaXMuZWM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZWMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5mbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Qanx8Y2I7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy4kai5Eay5Caz93aW5kb3cuT08uJGouRGsuQmsuVHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IGNiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlJqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMucW58fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlNpfHxnYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZT1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxlPWEuZGF0YS5tZXNzYWdlKTtmLkQoIndlbHQuZGUiKSYmIXRoaXMuc24mJih0aGlzLnNuPSEwLGYuRWkoYikpOzEyMDUhPWImJig5MDA9PWImJjA8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRWcoYS5hZEVycm9yRXZlbnRzKTsKYS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe2YuRCgid2VsdC5kZSIpJiYhdGhpcy5ybiYmKHRoaXMucm49ITAsZi5GaSgpKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaGI9Yy5SaXx8aGI7KGZ1bmN0aW9uKGMpe2MuVGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxVaDpmdW5jdGlvbihhKXthPW5ldyBnYihhKTthLmhhP3RoaXMuUCgpOnRoaXMuTShhKXx8KGEuUWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLk4oYSksKG5ldyBoYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1sfHwodGhpcy5NbD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuVWgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlVoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgaWI9Yy5UaXx8aWIsVD1uZXcgaWIodCk7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgamI9Yy5RbHx8amI7bmV3IGpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmtrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYSl7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGEpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ra3x8VTsoZnVuY3Rpb24oYyl7Yy5qaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3Lm5kKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLnBuKGEpfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpOwp3Lm5kKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5vbSgpfSxwbjpmdW5jdGlvbihhKXt2YXIgYj0iIixlO2ZvcihlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSl7Yj1pc05hTihhW2VdKT8hMTphW2VdO2lmKDEwMDk9PWFbZV18fDEwMDE9PWFbZV18fDMwMz09YVtlXXx8NDAzPT1hW2VdKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2VdKWlmKGFbZV0uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbZV1bZF0pPyExOmFbZV1bZF0sMTAwOT09YVtlXVtkXXx8MTAwMT09YVtlXVtkXXx8MzAzPT1hW2VdW2RdfHw0MDM9PWFbZV1bZF0pKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufX10aGlzLm0oImFkZXJyb3IiLGIpO3RoaXMuQygpfX0pfSkoYyk7dmFyIFY9Yy5qa3x8VjsoZnVuY3Rpb24oYyl7Yy5saz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO3RoaXMuTGQmJihhPWYuQWwoYSx0aGlzLkxkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTShkKSl7dGhpcy5OKGQpO3ZhciBjPW5ldyBWKGQsdGhpcy5HKTtjLmYoKX19Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IoZT1hW2JdO2UucGFyZW50RWxlbWVudDspe3ZhciBlPWUucGFyZW50RWxlbWVudCxoPWUuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5MZHx8Cih0aGlzLkxkPVtdKSx0aGlzLkxkLnB1c2goYVtiXSksZD1uZXcgVShoKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksYz1uZXcgVihkLHRoaXMuRyksYy5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxuZDpmdW5jdGlvbihhLGIsZSl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYV18fCh0aGlzLmNhW2FdPXt9KTt0aGlzLmNhW2FdW2JdfHwodGhpcy5jYVthXVtiXT1bXSk7dGhpcy5jYVthXVtiXS5wdXNoKGUpfSxObzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVtiXSl0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGEpLHRoaXMuWW4oKSYmKHRoaXMuemYoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgZT0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihlPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtiXVtlXSYmMDx0aGlzLmNhW2JdW2VdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2JdW2VdLmxlbmd0aDtkKyspdGhpcy5jYVtiXVtlXVtkXShhKX19LG9tOmZ1bmN0aW9uKCl7aWYodGhpcy5WYylmb3IodmFyIGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5WY1thXSxlPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbZV1bZF0mJjA8dGhpcy5jYVtlXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmNhW2VdW2RdLmxlbmd0aDtjKyspdGhpcy5jYVtlXVtkXVtjXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1hLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9YS5vRXZlbnRUeXBlLmgmJncuTm8oYSl9fSl9KShjKTt2YXIga2I9Yy5sa3x8a2Isdz1uZXcga2IodCk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5FbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBsYXkoKX0pfSwKdWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLk9pfHxtYjsoZnVuY3Rpb24oYyl7Yy5QaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIithKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5QaXx8bmI7KGZ1bmN0aW9uKGMpe2MuUWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYSYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT0KYVtiXSxkPSIiO3RyeXtkPWUuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGMpe2Q9ZS5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgbWIoZCk7dGhpcy5NKGYpfHwodGhpcy5OKGYpLChuZXcgbmIoZix0aGlzLkcpKS5mKCkpfWNhdGNoKGgpe319dGhpcy5QKCl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGUgaW4gdGhpcy5NYSlpZihiPT10aGlzLk1hW2VdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5RaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFiPWMuem58fHFiO25ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy5wbHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSksdGhpcy5wbD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSmcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz1hLnNvdXJjZS5DSE9PU0VSX0FCfHwiIixoPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYywhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9pbnRlcmFjdGlvbiIsCmMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLkpnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuTm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmljfHwodGhpcy5pYz1bXSk7dGhpcy5pYy5wdXNoKGEpfSxxbDpmdW5jdGlvbigpe2lmKHRoaXMuaWMmJnRoaXMuaWMubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5pYy5sZW5ndGg7YSsrKXRyeXt0aGlzLmljW2FdKCl9Y2F0Y2goYil7fX0sRmQ6ZnVuY3Rpb24oKXtpZih0aGlzLktjKXJldHVybiB0aGlzLktjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE5uOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuTmp8fHJiOyhmdW5jdGlvbihjKXtjLk1qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5EaT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMuRGkmJih0aGlzLmkoKSx0aGlzLkRpPSEwLHRoaXMubmEoKSk7Yi5VYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSWV8fCh0aGlzLkllPTEpLHRoaXMuSWUrKywxMDA8dGhpcy5JZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTWp8fHNiOyhmdW5jdGlvbihjKXtjLk9qPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7Zi50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgZT0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspZT0KbmV3IHJiKGFbZF0pLHRoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IHNiKGUsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciB0Yj1jLk9qfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlRrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdmI9Yy52a3x8dmI7KGZ1bmN0aW9uKGMpe2MudWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LExuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMuRGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuTG4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuRGMpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5oYltiXSYmMzAzIT10aGlzLmhiW2JdJiY0MDMhPXRoaXMuaGJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLmphKCk7CmVsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy51a3x8d2I7KGZ1bmN0aW9uKGMpe2Mud2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBlPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuTShlKXx8LTE9PWUuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihlKSwobmV3IHdiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB4Yj1jLndrfHx4Yix5Yj1uZXcgeGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgemI9Yy5HbHx8emI7bmV3IHpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmRrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnVmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5DbigpfS5iaW5kKHRoaXMpLDUwMCl9LENuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnVmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LHlvOmZ1bmN0aW9uKCl7dGhpcy51Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuZGt8fEFiOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5abT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMud2N8fCh0aGlzLndjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLndjfHx0aGlzLndjKyssdGhpcy53Yzw9dGhpcy5abT8odGhpcy53YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkueW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuY2t8fEJiOyhmdW5jdGlvbihjKXtjLmVrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBCYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIENiPWMuZWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkZsfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5iaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE5hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5ia3x8RmI7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVWEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5RbSgpOnRoaXMuR2coKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxzbDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sUW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpiKCk7IWEucGEmJmEuWSYmYS5TcCYmYS5VcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEdnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgZTthOnthPWEuZ2V0RXJyb3IoKTtmb3IoZSBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtlXSl7ZT1hW2VdO2JyZWFrIGF9ZT12b2lkIDB9MTAwOT09ZXx8MzAzPT1lfHw0MDM9PQplPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGUpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5KYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5VYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sbnE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSmIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuYWt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0samw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IEdiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLmpsKGFbYl0pO3RoaXMuUCgpfX0pO2MuZ2QuSmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBkPQpiW2VdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0mJmJbZV0uZmVybW9kJiZhLnB1c2goYltlXS5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy52anx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sJGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVWE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLkpqfHxYOyhmdW5jdGlvbihjKXtjLklqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnZmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMudmY9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGU9YS5wbGF5ZXJDb250YWluZXI7ZSYmdGhpcy52ZiYmZSE9dGhpcy52Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLkQoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLnNxKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSWp8fFk7KGZ1bmN0aW9uKGMpe2MuS2o9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLAplPWIubGVuZ3RoLGQ9MDtkPGU7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLnpmKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBHLEtiPWMuS2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5ZaXx8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubWo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxlPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksZT1hLkdldEVsKCksYiYmZT8odGhpcy5UKGUpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5tanx8TmI7KGZ1bmN0aW9uKGMpe2MubGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxCZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksZT0wO2U8Yi5sZW5ndGg7ZSsrKXRoaXMuaGFuZGxlRXJyb3IoYltlXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLmxqfHxPYjsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgTmIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgT2IoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFBiPWMubmp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmJqfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGU9ITE7YT8oZT1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZlPyh0aGlzLlQoZSksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuVml8fFNiOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy5XaXx8VGI7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGU9bmV3IFNiKGFbYl0pO2UuaGF8fHRoaXMuTShlKXx8KHRoaXMuTihlKSx3aW5kb3cuYnJpZHBsYXllcj1lLChuZXcgVGIoZSx0aGlzLkcpKS5mKCkpfX10aGlzLlAoKX19KX0pKGMpO3ZhciBVYj1jLlhpfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMubm58fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSwkZDpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LE1uOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuemt8fFhiOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmhjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0saGM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkdrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuR2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmhjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuUW4oKX0sUW46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5Lbj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5Lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmhjKGEpKX19KX0pKGMpO3ZhciBZYj1jLnlrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhLk1uKCksYT1uZXcgWWIoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMuQWt8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5kanx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2V8fChlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtlPyh0aGlzLlcoZSksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5lbj1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW59LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlpkKGEpfS5iaW5kKHRoaXMpKX0sWmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5va3x8TjsoZnVuY3Rpb24oYyl7Yy5uaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8Cih0aGlzLlBiPTApLHRoaXMuUGIrKywxNTx0aGlzLlBiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLm1vKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5LPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT0KYS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSYmYVtjXSYmYVtjXS5hZEVycm9yJiZhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMubmt8fE87KGZ1bmN0aW9uKGMpe2MucGs9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuemYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBiYz1jLnBrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5janx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ganx8WjsoZnVuY3Rpb24oYyl7Yy5Faj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuVGIoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy56YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx6YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRWp8fGFhOyhmdW5jdGlvbihjKXtjLkdqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGVjPWMuR2p8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLlBtfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLmpqfHxoYzsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5GZygpfSxGZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMuaWp8fAppYzsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuUCgpO3JldHVybn1pZighdGhpcy5NKGEpKXt0aGlzLk4oYSk7KG5ldyBpYyhhLHRoaXMuRykpLmYoKTt0aGlzLlAoKTtyZXR1cm59fXRoaXMuUCgpfX0pfSkoYyk7dmFyIGpjPWMua2p8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLkJsfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLkppfHxtYzsoZnVuY3Rpb24oYyl7Yy5JaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5BZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5BZS5iaW5kKHRoaXMpLDEwMCl9LEFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5JaXx8bmM7KGZ1bmN0aW9uKGMpe2MuS2k9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxUYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLlAoKTp0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBuYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5QKCl9fSl9KShjKTt2YXIgb2M9Yy5LaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuaGt8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5OZD1bXTt0aGlzLnlmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5Zaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmdtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnlmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy55ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5OZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxnbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy55ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxBbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV0uJGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5OZFthXS4kYil9fX0pKGMpO3ZhciByYz0KYy5Zanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy50bnx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGwuV28pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGwuam4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTWUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5EbHx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLk1iPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi53YigibmV3QWRkZWxpdmVyeSIpfWMuTGk9YTthLnByb3RvdHlwZT17aW86ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApjbzpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LGJvOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LGFkOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnptKCkpdGhpcy5NYi5nKHRoaXMuTWIuUWMsdGhpcy5NYi5xYSx0aGlzLk1iLnhmLGZ1bmN0aW9uKCl7dGhpcy5hZChhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTWIuamMpO2Vsc2UgaWYoay5EYiYmIWsuSGkpay5YbShmdW5jdGlvbigpe3RoaXMuYWQoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhsLkljLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5DbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLndiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTWIsaCk7bS4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmZmJiYoZD10aGlzLnBsYXllci5mZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5oZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx6bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LHNvOmZ1bmN0aW9uKCl7Zi53YigicHJlcm9sbCIpO2YuRWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuYWQoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX0scm86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRWYoInBvc3Ryb2xsIik7Zi53YigicG9zdHJvbGwiKTt0aGlzLmlvKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLmFkKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxUbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBvKHRoaXMucm8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sU2Q6ZnVuY3Rpb24oYSl7Zi53YigibWlkcm9sbCIpO2YuRWYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5hZChjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8obC53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxTbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmhvKHRoaXMuU2QuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGYoKX0sZjpmdW5jdGlvbigpe3RoaXMuc28oKTt0aGlzLnBsYXllci5sZiYmdGhpcy5TbigpO3RoaXMuVG4oKX19fSkoYyk7dmFyIGZhPWMuTGl8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy5pa3x8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFBoZVhhaWtpY2h1eGFUYWgsUGhlWGFpa2ljaHV4YVRhaCk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
148.251.51.163
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.163.51.251.148.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
|
GET
H/1.1
|
200
OK
|
submit
lb95.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
116ms
28ms
|
Image
image/gif |
136.243.4.15
HETZNER-AS
|
|
General
- Full URL
- https://lb95.s400.meetrics.net/bb-mx/submit?/+spDBWAAA/whFcBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFvzEwlFjpFhsFzvBwhF5wFhsFtnEliF1lFoyFluFylFjoFulFytBrvFz0FluFtvEusFpuFltBlyFtpF00FlsFuvBfpyF+k2FoywAx5AtxAxtAy1AtxAx6Aw4At2A35A2wAwtAyuAxxA1uAytAkzB0zAlkFimFL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BEOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwS1MBPAAAAAAAAAOAAAAGBAAAAAAZwS1MBBRksFAQtjFqHoATA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.15
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h217.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb95.s400.meetrics.net/
|
43 B
308 B
|
147ms
30ms
|
Image
image/gif |
136.243.4.15
HETZNER-AS
|
|
|
GET
H2
|
200
|
nuggad
ih.adscale.de/
|
49 B
282 B
|
21ms
21ms
|
Image
image/gif |
52.57.195.246
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
Redirect Chain
-
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n121=2&n42=1&n116=0&n104=1&n15=1&n155=0&n106=0&n153=0&n11=2&n120=6&n53=1&n154=0&n125=0&n8=1&n2=4&n137=0&n...
-
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n121=2&n42=1&n116=0&n104=1&n15=1&n155=0&n106=0&n153=0&n11=2&n120=6&n53=1&n154=0&n125=0&n8=1&n2=4&n137=0&n...
|
3 KB
2 KB
|
40ms
39ms
|
Script
text/javascript |
23.37.42.216
AKAMAI-AS
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n121=2&n42=1&n116=0&n104=1&n15=1&n155=0&n106=0&n153=0&n11=2&n120=6&n53=1&n154=0&n125=0&n8=1&n2=4&n137=0&n101=1&n108=0&n54=0&n110=1&n87=1&n149=0&n76=1&n66=0&n139=0&n160=0&n107=0&n21=1&n40=1&n51=1&n117=5&n86=0&n147=4&n64=0&n119=3&n22=1&n18=1&n161=0&n126=0&n92=3&n62=1&n57=1&n77=1&n83=0&n102=0&n105=0&n159=0&n20=1&n80=1&n12=3&n141=0&n157=0&n26=1&n99=0&n128=1&n73=1&n118=3&n85=0&n9=3&n6=1&n63=1&n58=1&n138=0&n140=0&n94=2&n111=0&n136=1&n79=1&n93=2&n90=0&n142=0&n7=2&n103=1&n158=1&n124=0&n75=1&n91=0&n114=0&n69=0&n10=3&n3=1&n82=1&n33=1&n59=1&n84=1&n5=1&n109=0&n122=2&n67=2&n115=1&n89=1&n123=1&n17=1&n78=0&n81=0&n88=0&n39=1&n156=1&n148=0&n132=4&n133=1&checkcookies=true
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
23.37.42.216
, Netherlands,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a23-37-42-216.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- 145a92b6ac8f7e283ca3f55fb6f0081e4c38cb4a4dfc81b4cbb2ba2ddc336340
|
GET
H2
|
200
|
ForumViewTopicContentAD.Cj3s-YOGFGen4.png
www.giga.de/special/gutscheine/
|
71 B
273 B
|
41ms
41ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b5f4eda2b77643c9c5113440df20e9f3&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db5f4eda2b77643c9c5113440df20e9f3%2...
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b5f4eda2b77643c9c5113440df20e9f3&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db5f4eda2b77643c9c5113440df20e9f3%2...
-
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=b5f4eda2b77643c9c5113440df20e9f3&userId=adscale-user:523ad0eff17d461f9bbc2c326b3b34ed
|
44 B
574 B
|
36ms
36ms
|
Image
image/gif |
23.37.42.216
AKAMAI-AS
|
|
|
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=tfTtord2Q8nFETRA3yDp8w
-
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
|
44 B
569 B
|
44ms
43ms
|
Image
image/gif |
23.37.42.216
AKAMAI-AS
|
|
|
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
|
|
|
GET
H2
|
200
|
index.html
cdn.districtm.io/ids/
Frame AF23
|
0
0
|
200ms
160ms
|
Document
text/html |
104.16.190.66
CLOUDFLARENET
|
|
General
- Full URL
- https://cdn.districtm.io/ids/index.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
104.16.190.66
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
|
GET
H/1.1
|
200
OK
|
showad.js
ads.pubmatic.com/AdServer/js/
Frame EDA6
|
0
0
|
342ms
39ms
|
Document
text/html |
23.210.249.92
AKAMAI-AS
|
|
|
GET
H2
|
200
|
pd
u.openx.net/w/1.0/
Frame 3B46
Redirect Chain
-
https://u.openx.net/w/1.0/pd
-
https://u.openx.net/w/1.0/pd?cc=1
|
0
0
|
35ms
35ms
|
Document
text/html |
34.95.120.147
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
data
lb95.s400.meetrics.net/
|
43 B
308 B
|
26ms
26ms
|
Image
image/gif |
136.243.4.15
HETZNER-AS
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
32ms
31ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/o.gif?__iz=0&__id=1582885289643&__it=-60&__ic=727391&__iq=f697e9c47092634dbb44e07a137172f6&__ig=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
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=1582885293104&ns_c=UTF-8&cv=3.5&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga....
-
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1582885293104&ns_c=UTF-8&cv=3.5&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga...
|
0
248 B
|
23ms
22ms
|
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=1582885293104&ns_c=UTF-8&cv=3.5&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&c9=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- 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
|
/
Show response
track.adform.net/Serving/Cookie/
|
73 B
494 B
|
34ms
32ms
|
Script
text/javascript |
37.157.4.25
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.486310280f148d9827ab2af608ead7d9.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
37.157.4.25
, 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
|
137ms
41ms
|
Script
application/javascript |
52.49.69.125
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
gocp.stroeermediabrands.de/absconf/www.giga.de/
|
22 KB
22 KB
|
202ms
121ms
|
Fetch
application/json |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
248 B
|
6ms
6ms
|
Image
image/gif |
2a03:2880:f12d:83:face:b00c:0:25de
FACEBOOK
|
|
|
GET
H/1.1
|
200
OK
|
t.png
gocp.stroeermediabrands.de/
|
98 B
355 B
|
27ms
27ms
|
Image
image/png |
188.40.16.106
HETZNER-AS
|
|
General
- Full URL
- https://gocp.stroeermediabrands.de/t.png?title=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&contentPieceId=2762322&publishDate=2016-05-25T18%3A29%3A51%2B02%3A00&_=1582885293195.-1413964148
- 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
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
67ms
22ms
|
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
|
82ms
24ms
|
Script
application/javascript |
89.163.159.117
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
0
316 B
|
278ms
73ms
|
Script
application/javascript |
194.213.222.29
GTSCE GTS Central...
|
|
|
GET
H2
|
200
|
default.js
Show response
ups.xplosion.de/loader/69511/
|
2 KB
2 KB
|
114ms
38ms
|
Script
text/javascript |
54.171.36.151
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:21f3:c400:15:efbc:e300:93a1
AMAZON-02
|
|
|
GET
H2
|
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
581 B
|
69ms
26ms
|
Image
image/gif |
35.186.238.175
GOOGLE
|
|
|
GET
H2
|
200
|
monitoring.js
Show response
acdn.prod.pubstack.io/
|
61 KB
19 KB
|
25ms
9ms
|
XHR
application/javascript |
2620:1ec:bdf::10
MICROSOFT-CORP-MS...
|
|
|
GET
H2
|
200
|
map
ih.adscale.de/
Frame 1F5D
Redirect Chain
-
https://ih.adscale.de/map?ssl=1&format=video
-
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=b7d849918f93436892a3bcd428b9928b
|
0
0
|
22ms
22ms
|
Document
text/html |
52.57.195.246
AMAZON-02
|
|
|
GET
H2
|
200
|
launcher.js
Show response
sak.userreport.com/sdm/
|
64 KB
20 KB
|
78ms
33ms
|
Script
application/javascript |
13.224.194.102
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:21f3:9000:1c:8c89:a300:93a1
AMAZON-02
|
|
|
GET
H2
|
200
|
/
d.agkn.com/iframe/8613/
Frame 1B31
|
0
0
|
26ms
11ms
|
Document
text/html |
2600:9000:20eb:7200:19:fc2c:a140:93a1
AMAZON-02
|
|
General
- Full URL
- https://d.agkn.com/iframe/8613/?che=907326429&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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%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:20eb:7200: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/
|
4 KB
3 KB
|
39ms
39ms
|
Script
text/javascript |
54.171.36.151
AMAZON-02
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%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=480b4494fe340ce3569442613ff79465&event_id=page_view&_sid=69511&_ver=0.2.25&_seg=jsonp&_=328882951235
- 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.171.36.151
Dublin, Ireland,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- ec2-54-171-36-151.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
- 9a6a842a71b24ad396f378acc12f6ef11455a9134f251abc76b16c22a63d81b8
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
849 B
|
153ms
38ms
|
Script
application/javascript |
54.154.128.203
AMAZON-02
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
Frame BA4D
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa3BDJ3WS7ZBsasBDUkWsfABifABSfABSfABiUABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
-
https://uss.xplosion.de/usersync?sid=65966&fpid=4219359112066865229
|
42 B
660 B
|
118ms
39ms
|
Image
image/gif |
54.246.164.155
AMAZON-02
|
|
|
OPTIONS
H2
|
204
|
error
Show response
intake.prod.pubstack.io/v1/intake/
|
0
178 B
|
126ms
35ms
|
XHR
text/plain |
52.30.80.108
AMAZON-02
|
|
|
OPTIONS
H2
|
204
|
auction
Show response
intake.prod.pubstack.io/v1/intake/
|
0
178 B
|
126ms
36ms
|
XHR
text/plain |
52.30.80.108
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame 63E2
|
0
0
|
162ms
42ms
|
Document
text/html |
34.252.24.237
AMAZON-02
|
|
|
POST
H2
|
204
|
auction
Show response
intake.prod.pubstack.io/v1/intake/
|
0
57 B
|
37ms
37ms
|
XHR
text/plain |
52.30.80.108
AMAZON-02
|
|
|
POST
H2
|
204
|
error
Show response
intake.prod.pubstack.io/v1/intake/
|
0
57 B
|
36ms
36ms
|
XHR
text/plain |
52.30.80.108
AMAZON-02
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
|
42 B
660 B
|
39ms
39ms
|
Image
image/gif |
54.246.164.155
AMAZON-02
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
28ms
27ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
|