Submitted URL: http://tvtoday.de/
Effective URL: https://www.tvtoday.de/
Submission: On January 31 via manual from DE

Summary

This website contacted 19 IPs in 4 countries across 15 domains to perform 74 HTTP transactions. The main IP is 151.106.72.75, located in Germany and belongs to PLUSSERVER-ASN1, DE. The main domain is www.tvtoday.de.
TLS certificate: Issued by AlphaSSL CA - SHA256 - G2 on April 16th 2019. Valid for: 2 years.
This is the only time www.tvtoday.de was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
1 44 151.106.72.75 61157 (PLUSSERVE...)
1 143.204.93.103 16509 (AMAZON-02)
2 2.20.143.13 20940 (AKAMAI-ASN1)
2 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 91.215.103.64 43407 (INFONLINE-AS)
3 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2 91.215.103.65 43407 (INFONLINE-AS)
1 2a00:1450:400... 15169 (GOOGLE)
6 65.9.58.127 16509 (AMAZON-02)
1 2a00:1450:400... 15169 (GOOGLE)
1 136.243.25.120 24940 (HETZNER-AS)
2 52.216.17.35 16509 (AMAZON-02)
2 143.204.93.40 16509 (AMAZON-02)
1 2600:9000:206... 16509 (AMAZON-02)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
4 148.251.3.103 24940 (HETZNER-AS)
1 78.46.33.212 24940 (HETZNER-AS)
74 19
Domain Requested by
25 images.tvtoday.de www.tvtoday.de
18 www.tvtoday.de www.tvtoday.de
6 cmp.tvtoday.de www.tvtoday.de
cmp.tvtoday.de
4 ssl.2.damoh.tvtoday.de www.tvtoday.de
3 www.google-analytics.com www.tvtoday.de
2 hgc-cf-cache-1.svonm.com www.tvtoday.de
2 s3.amazonaws.com www.tvtoday.de
2 de.ioam.de 1 redirects www.tvtoday.de
2 a2.tvspielfilm.de www.tvtoday.de
a2.tvspielfilm.de
1 ssl.1.damoh.tvtoday.de text
1 p5.focus.de
1 d2p3zdq8vjvnxd.cloudfront.net
1 uobsoe.com www.tvtoday.de
1 stats.g.doubleclick.net www.tvtoday.de
1 s0.2mdn.net www.tvtoday.de
1 www.googletagmanager.com www.tvtoday.de
1 a.bf-tools.net www.tvtoday.de
1 script.ioam.de www.tvtoday.de
1 a.bf-ad.net www.tvtoday.de
1 cdn.privacy-mgmt.com www.tvtoday.de
1 tvtoday.de 1 redirects
74 21
Subject Issuer Validity Valid
*.tvtoday.de
AlphaSSL CA - SHA256 - G2
2019-04-16 -
2021-05-04
2 years crt.sh
*.privacy-mgmt.com
R3
2020-12-06 -
2021-03-06
3 months crt.sh
a2.tvspielfilm.de
R3
2020-12-03 -
2021-03-03
3 months crt.sh
bf-tools.net
R3
2021-01-27 -
2021-04-27
3 months crt.sh
*.ioam.de
Thawte TLS RSA CA G1
2019-09-18 -
2021-12-17
2 years crt.sh
*.google-analytics.com
GTS CA 1O1
2021-01-05 -
2021-03-30
3 months crt.sh
*.doubleclick.net
GTS CA 1O1
2021-01-05 -
2021-03-30
3 months crt.sh
cmp.bestcheck.de
R3
2020-12-10 -
2021-03-10
3 months crt.sh
*.g.doubleclick.net
GTS CA 1O1
2021-01-05 -
2021-03-30
3 months crt.sh
uobsoe.com
R3
2020-12-30 -
2021-03-30
3 months crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2020-08-04 -
2021-08-09
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2020-07-22 -
2021-08-22
a year crt.sh
*.cloudfront.net
DigiCert Global CA G2
2020-05-26 -
2021-04-21
a year crt.sh
*.focus.de
DigiCert Secure Site ECC CA-1
2020-06-23 -
2021-09-22
a year crt.sh
ssl.1.damoh.tvtoday.de
R3
2021-01-22 -
2021-04-22
3 months crt.sh

This page contains 3 frames:

Primary Page: https://www.tvtoday.de/
Frame ID: 988A4AE1C9ED67C209BAF56D27256C30
Requests: 80 HTTP requests in this frame

Frame: https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&preload_message=true&consentLanguage=de
Frame ID: 48D1C6573E8F62EF537BB52594AF542C
Requests: 6 HTTP requests in this frame

Frame: data://truncated
Frame ID: 656DDE44FA885338FBBE47C4DFB1D55A
Requests: 1 HTTP requests in this frame

Screenshot


Page URL History Show full URLs

  1. http://tvtoday.de/ HTTP 301
    https://www.tvtoday.de/ Page URL

Page Statistics

74
Requests

100 %
HTTPS

39 %
IPv6

15
Domains

21
Subdomains

19
IPs

4
Countries

1596 kB
Transfer

4344 kB
Size

13
Cookies

Page URL History

This captures the URL locations of the websites, including HTTP redirects and client-side redirects via JavaScript or Meta fields.

  1. http://tvtoday.de/ HTTP 301
    https://www.tvtoday.de/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 25
  • https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&ct=0100000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DK%2FHovedstaden&cb=0016&i2=0016b6eff25a0c99b60172bd7&ep=1634893380&vr=421&id=b3ypd5&i3=0016b6eff25a0c99b60172bd7%3A1641334487546%3A1612131287546%3A.tvtoday.de%3A1%3Atvspielf%3AD%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday%3Anoevent%3A1612131287546&n1=1&dntt=0&lt=1612131287547&ev=&cs=2nfa8k&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&ct=0100000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DK%2FHovedstaden&cb=0016&i2=0016b6eff25a0c99b60172bd7&ep=1634893380&vr=421&id=b3ypd5&i3=0016b6eff25a0c99b60172bd7%3A1641334487546%3A1612131287546%3A.tvtoday.de%3A1%3Atvspielf%3AD%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday%3Anoevent%3A1612131287546&n1=1&dntt=0&lt=1612131287547&ev=&cs=2nfa8k&mo=1&sr=71

74 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.tvtoday.de/
Redirect Chain
  • http://tvtoday.de/
  • https://www.tvtoday.de/
610 KB
66 KB
Document
General
Full URL
https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
9b2f485ce1c23140b096566bd4e3921f6760033433d1313167ebda10d04ac172
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

:method
GET
:authority
www.tvtoday.de
:scheme
https
:path
/
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
none
sec-fetch-mode
navigate
sec-fetch-user
?1
sec-fetch-dest
document
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sun, 31 Jan 2021 22:01:04 GMT
strict-transport-security
max-age=15768000
content-type
text/html; charset=UTF-8
last-modified
Sun, 31 Jan 2021 22:01:04 GMT
cache-control
max-age=901, public
x-varnish
944798225 956694961 956537242 953604818
content-encoding
br
age
821
vary
x-requested-with,Accept-Encoding
accept-ranges
bytes

Redirect headers

Date
Sun, 31 Jan 2021 21:24:44 GMT
Location
https://www.tvtoday.de/
Content-Type
text/html; charset=iso-8859-1
Last-Modified
Sun, 31 Jan 2021 21:24:44 GMT
Cache-Control
public, max-age=7200
Content-Encoding
gzip
X-Varnish
951539988 955814727
Age
3003
Vary
Accept-Encoding
Content-Length
190
Connection
keep-alive
dfdd70c.css
www.tvtoday.de/css/
313 KB
39 KB
Stylesheet
General
Full URL
https://www.tvtoday.de/css/dfdd70c.css?10.499
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
6af654da3487974cabaad7ae8d273e5ee3b6e5adb8c1f8bc74b2a01b57bf16b0
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:52:40 GMT
content-encoding
br
last-modified
Tue, 01 Dec 2020 10:41:49 GMT
age
1326
etag
W/"4e521-5b564c62cf71c-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
956011598 951746338, 956537243 940697358
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
text/css
StickySearchController.js
www.tvtoday.de/app/js/components/header/
404 B
488 B
Script
General
Full URL
https://www.tvtoday.de/app/js/components/header/StickySearchController.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
ddfa922e4f9fcd81cf6ab8c51707fe681cf1001ad918e793eabeea5d8b2c6967
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:30:01 GMT
content-encoding
br
last-modified
Thu, 20 Dec 2018 07:17:40 GMT
age
2685
etag
W/"194-57d6eed0ecd72-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
943892984 920541362, 944675665 941509983
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
application/javascript
roboto-v18-latin-regular.woff2
www.tvtoday.de/bundles/frontend/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.tvtoday.de/bundles/frontend/fonts/roboto-v18-latin-regular.woff2
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Origin
https://www.tvtoday.de
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sun, 31 Jan 2021 22:09:05 GMT
content-encoding
br
last-modified
Wed, 30 Jan 2019 08:45:19 GMT
age
341
etag
W/"3bf0-580a8ee00d4d3-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
956696441 956308355, 956309603 956826203
access-control-allow-origin
*
cache-control
public, max-age=31536000
strict-transport-security
max-age=15768000
accept-ranges
bytes
roboto-condensed-v16-latin-700.woff2
www.tvtoday.de/bundles/frontend/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.tvtoday.de/bundles/frontend/fonts/roboto-condensed-v16-latin-700.woff2
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
30da2bff9b5cb0f94b04c9c21ec607dfb1b46cf706802a093185036b333f89e6
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Origin
https://www.tvtoday.de
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sun, 31 Jan 2021 21:15:56 GMT
content-encoding
br
last-modified
Wed, 30 Jan 2019 08:45:19 GMT
age
3529
etag
W/"3b94-580a8ee00a5f0-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
939192809 943120165, 942892077 944181378
access-control-allow-origin
*
cache-control
public, max-age=31536000
strict-transport-security
max-age=15768000
accept-ranges
bytes
roboto-v18-latin-700.woff2
www.tvtoday.de/bundles/frontend/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.tvtoday.de/bundles/frontend/fonts/roboto-v18-latin-700.woff2
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
1d5b7c64458f4af91dcfee0354be47adde1f739b5aded03a7ab6068a1bb6ca97
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Origin
https://www.tvtoday.de
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sun, 31 Jan 2021 22:09:58 GMT
content-encoding
br
last-modified
Wed, 30 Jan 2019 08:45:19 GMT
age
288
etag
W/"3c4c-580a8ee00bd67-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
954620402 956600848, 954320548 955885340
access-control-allow-origin
*
cache-control
public, max-age=31536000
strict-transport-security
max-age=15768000
accept-ranges
bytes
wrapperMessagingWithoutDetection.js
cdn.privacy-mgmt.com/
148 KB
43 KB
Script
General
Full URL
https://cdn.privacy-mgmt.com/wrapperMessagingWithoutDetection.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
143.204.93.103 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-93-103.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
7b2ee61bcca53f60642717b52fbd8c07d37d0cd5459d9601abafe9ae10ab2c18

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:31:58 GMT
content-encoding
gzip
last-modified
Thu, 28 Jan 2021 21:40:41 GMT
server
AmazonS3
age
2570
etag
W/"f093ddcade67ece03b6676d9c8231c9c"
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
via
1.1 ee6ddabcc69c6aa1c28ad24a4a8f86b2.cloudfront.net (CloudFront)
cache-control
max-age=3600
x-amz-cf-pop
FRA50-C1
x-amz-cf-id
1by-UF9QmSLAPaoiHex8glYQQi-wm8WXtMBufJZ7n7Il7qzIgKoVjQ==
channel_webp_optimized.css
a2.tvspielfilm.de/images/tv/sender/mini/
22 KB
3 KB
Stylesheet
General
Full URL
https://a2.tvspielfilm.de/images/tv/sender/mini/channel_webp_optimized.css
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.20.143.13 , Ascension Island, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-20-143-13.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
17b83f6abf2bd24ee17266a0d2d17f44b5a328414e236d1a2bb6268440fb6d89
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

strict-transport-security
max-age=15768000
content-encoding
gzip
last-modified
Fri, 18 Dec 2020 14:00:59 GMT
server
Apache
etag
"582b-5b6bd89b6b84d-gzip"
vary
Accept-Encoding
content-type
text/css
access-control-allow-origin
*
cache-control
public, max-age=1531032, s-maxage=2592001
date
Sun, 31 Jan 2021 22:14:47 GMT
accept-ranges
bytes
content-length
3052
expires
Thu, 18 Feb 2021 15:31:59 GMT
46cfa08.js
www.tvtoday.de/js/
16 KB
5 KB
Script
General
Full URL
https://www.tvtoday.de/js/46cfa08.js?10.499
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
2fcbe9ed682b16557f66e6fd4e7fa33b647eb54f921f4a3c37c526fb30ba45ab
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:50:50 GMT
content-encoding
br
last-modified
Thu, 15 Nov 2018 08:42:47 GMT
age
1437
etag
W/"402e-57ab008ffeede-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
954551347 940668765, 956860061 945778958
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
application/javascript
adengine.js
a.bf-ad.net/adengine/tvtoday/
600 KB
184 KB
Script
General
Full URL
https://a.bf-ad.net/adengine/tvtoday/adengine.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:6c00::210:bab2 , Ascension Island, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
327056aff8450506523ea2f4df99b4a24f01d77f2824706c0e01c28a3b11428e

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:14:47 GMT
content-encoding
gzip
last-modified
Thu, 28 Jan 2021 08:36:47 GMT
server
AkamaiNetStorage
etag
"ef720fb0dcccf58ec5a39b3a5979b943:1611823014.785232"
vary
Accept-Encoding
content-type
application/x-javascript
access-control-allow-origin
cache-control
max-age=900
access-control-allow-credentials
true
accept-ranges
bytes
expires
Sun, 31 Jan 2021 22:29:47 GMT
tfm.videopkg.min.js
www.tvtoday.de/js/
150 KB
44 KB
Script
General
Full URL
https://www.tvtoday.de/js/tfm.videopkg.min.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
921ecfdbc7b2b862099cb55dd98e60d5eb25213ab39de4b32f8d98f2e06286a0
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:42:15 GMT
content-encoding
br
last-modified
Sun, 31 Jan 2021 19:30:01 GMT
age
1951
etag
W/"2589f-5ba374376edc4-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
929607965 944795392, 955589482 951280825
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
application/javascript
iam.js
script.ioam.de/
19 KB
8 KB
Script
General
Full URL
https://script.ioam.de/iam.js?m=1
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.64 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script3.ioam.de
Software
nginx / BLACKBIRD-SRC v0.13 0016
Resource Hash
d0281adaf991fe6241587cd3bc4d545fe8b44c00705137a6994b15724f88a0c6

Request headers

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

Response headers

Date
Sun, 31 Jan 2021 22:14:47 GMT
Content-Encoding
gzip
Last-Modified
Sun, 31 Jan 2021 22:14:47 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.13 0016
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
private, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Mon, 01 Feb 2021 00:14:47 GMT
tvt_logo_500x100.png
www.tvtoday.de/bundles/frontend/images/logos/
37 KB
38 KB
Image
General
Full URL
https://www.tvtoday.de/bundles/frontend/images/logos/tvt_logo_500x100.png?10.499
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
62214dab0c26ba36487bfa2d0498b0931ca9c8e20a2864b55ff509e3876d8692
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:53:38 GMT
last-modified
Fri, 02 Nov 2018 07:42:43 GMT
age
1268
etag
"9557-579a9ae471290"
vary
x-requested-with
x-varnish
956309604 955297022
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/png
vikings,201441_navigation_100.jpg
images.tvtoday.de/files/images/201807/3/
7 KB
7 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/201807/3/vikings,201441_navigation_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
b099ee6a5d30b54ef508de7ddfb2a78cd440ba624d27ed7d8b3f9a855f7d3de7
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:28:39 GMT
last-modified
Fri, 27 Jul 2018 13:22:05 GMT
age
2768
etag
"1ac3-571faff7af5a0"
vary
x-requested-with
x-varnish
942666338 943833518
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
avengers-age-of-ultron,201255_navigation_100.jpg
images.tvtoday.de/files/images/201807/3/
13 KB
13 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/201807/3/avengers-age-of-ultron,201255_navigation_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
e8aaebf9f69815ea93b6beff9b78806dacc9bcbf2a25eeee2297d5a95f1e2431
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:06:40 GMT
last-modified
Fri, 20 Jul 2018 21:32:02 GMT
age
487
etag
"327c-5717506c7e98c"
vary
x-requested-with
x-varnish
942944453 943694826
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
tvs_partner_logo.png
www.tvtoday.de/bundles/frontend/images/logos/
4 KB
5 KB
Image
General
Full URL
https://www.tvtoday.de/bundles/frontend/images/logos/tvs_partner_logo.png?10.499
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
be726dcabb9c264b1d1816ec0da60cb11fbb9b76afee12a82683d808a62a810c
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:57:37 GMT
last-modified
Wed, 18 Jul 2018 10:43:07 GMT
age
1029
etag
"1148-57143ba5eda4c"
vary
x-requested-with
x-varnish
912421633 942435761
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/png
600b258d8189651233c5b165_780.jpg
images.tvtoday.de/itv/2021-01-31/
51 KB
52 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-31/600b258d8189651233c5b165_780.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
12bfeecd8c7ec4be87b778077faea6a53e86fa5a0caf36e67bc8e4d63dd0edf3
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:10:40 GMT
last-modified
Sun, 24 Jan 2021 03:44:47 GMT
age
247
etag
"cd8f-5b99d3e29c818"
vary
x-requested-with
x-varnish
956860062 956110171
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
tatort-im-tv-quicklink-startseite-2020,225318_tm_100.jpg
images.tvtoday.de/files/images/202002/4/
22 KB
22 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/202002/4/tatort-im-tv-quicklink-startseite-2020,225318_tm_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
8d60669fddbf6b72a2e5fc8c13da74bbf90d1ea5da6676e058346414a14f2d55
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:29:26 GMT
last-modified
Thu, 27 Feb 2020 09:18:15 GMT
age
2720
etag
"5673-59f8b33716667"
vary
x-requested-with
x-varnish
912421634 944638468
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
fussball-im-tv-quicklink-startseite-2020,225320_tm_100.jpg
images.tvtoday.de/files/images/202002/3/
16 KB
16 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/202002/3/fussball-im-tv-quicklink-startseite-2020,225320_tm_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
19d502b1c90d16b4132b9b01229277607cd18150518ec92a806c475a7426238b
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:54:58 GMT
last-modified
Thu, 27 Feb 2020 09:18:15 GMT
age
1188
etag
"3fef-59f8b33717dd4"
vary
x-requested-with
x-varnish
956309605 928211461
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
erotik-im-tv-quicklink-startseite-2020,225322_tm_100.jpg
images.tvtoday.de/files/images/202002/5/
17 KB
18 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/202002/5/erotik-im-tv-quicklink-startseite-2020,225322_tm_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
103f77ffb505419ca5a6e4a8b74d9398f58ed76e484002911fd94e5796075bbb
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:12:14 GMT
last-modified
Thu, 27 Feb 2020 09:19:29 GMT
age
152
etag
"4567-59f8b37d9a5d1"
vary
x-requested-with
x-varnish
955589483 956373057
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
tv-tipps-heute-quicklink-startseite-2020,225317_tm_100.jpg
images.tvtoday.de/files/images/202002/2/
10 KB
10 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/202002/2/tv-tipps-heute-quicklink-startseite-2020,225317_tm_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
07effd27c24e20b1fc30659b8b771d95c785ab4d3dc3dedaccfcfbfd95b435e6
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:39:55 GMT
last-modified
Thu, 27 Feb 2020 09:19:29 GMT
age
2092
etag
"260b-59f8b37d9f3ef"
vary
x-requested-with
x-varnish
953868970 944794742
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
alle-spielfilme-quicklink-startseite-2020,225321_tm_100.jpg
images.tvtoday.de/files/images/202002/2/
12 KB
12 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/202002/2/alle-spielfilme-quicklink-startseite-2020,225321_tm_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
4dd67b29cc3e3eb840d0dce2c9088000e06b21134aabb021f2a2f98e5dc124b8
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:40:27 GMT
last-modified
Thu, 27 Feb 2020 09:21:36 GMT
age
2060
etag
"2fc9-59f8b3f674d7f"
vary
x-requested-with
x-varnish
956537246 954314726
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
mediatheken-tipps-quicklink-startseite-2020,225319_tm_100.jpg
images.tvtoday.de/files/images/202002/2/
15 KB
16 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/202002/2/mediatheken-tipps-quicklink-startseite-2020,225319_tm_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
e83b8ec23b952200c3ba4729bfbac3b4379e66de48a31ca39c255fa7201ea65a
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:05:43 GMT
last-modified
Thu, 27 Feb 2020 09:21:36 GMT
age
544
etag
"3ced-59f8b3f67e5d4"
vary
x-requested-with
x-varnish
912421636 943207671
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
de.js
a.bf-tools.net/de/
12 KB
4 KB
Script
General
Full URL
https://a.bf-tools.net/de/de.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:6c00::210:bab2 , Ascension Island, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
11e4124c9c8b37459ba4728d36dbbd9b5e6bf92683e24702001f922ddceace00

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:14:47 GMT
content-encoding
gzip
last-modified
Tue, 26 Jan 2021 13:53:06 GMT
server
AkamaiNetStorage
etag
"000cf7f698e09c7edd308f95317fc00c:1611669188.705517"
vary
Accept-Encoding
content-type
application/x-javascript
cache-control
max-age=900
accept-ranges
bytes
content-length
3830
expires
Sun, 31 Jan 2021 22:29:47 GMT
analytics.js
www.google-analytics.com/
46 KB
19 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:811::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
e441c3e2771625ba05630ab464275136a82c99650ee2145ca5aa9853bedeb01b
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

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

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Fri, 23 Oct 2020 03:00:57 GMT
server
Golfe2
age
3643
date
Sun, 31 Jan 2021 21:14:04 GMT
vary
Accept-Encoding
content-type
text/javascript
cache-control
public, max-age=7200
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
18817
expires
Sun, 31 Jan 2021 23:14:04 GMT
gtm.js
www.googletagmanager.com/
114 KB
39 KB
Script
General
Full URL
https://www.googletagmanager.com/gtm.js?id=GTM-M7SCL5
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:811::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
21441371e6406b1ab2d3343a03fe2c6a3514739dd3f47036af6ad706d872b311
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains
X-Xss-Protection 0

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:14:47 GMT
content-encoding
br
vary
Accept-Encoding
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
39251
x-xss-protection
0
last-modified
Sun, 31 Jan 2021 21:00:00 GMT
server
Google Tag Manager
strict-transport-security
max-age=31536000; includeSubDomains
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
private, max-age=900
access-control-allow-credentials
true
access-control-allow-headers
Cache-Control
expires
Sun, 31 Jan 2021 22:14:47 GMT
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&ct=0100000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DK%2FHove...
  • https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&ct=0100000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DK%2FHove...
0
717 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&ct=0100000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DK%2FHovedstaden&cb=0016&i2=0016b6eff25a0c99b60172bd7&ep=1634893380&vr=421&id=b3ypd5&i3=0016b6eff25a0c99b60172bd7%3A1641334487546%3A1612131287546%3A.tvtoday.de%3A1%3Atvspielf%3AD%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday%3Anoevent%3A1612131287546&n1=1&dntt=0&lt=1612131287547&ev=&cs=2nfa8k&mo=1&sr=71
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.65 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de3.ioam.de
Software
nginx / BLACKBIRD-RCV v1.06.2 0028
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Date
Sun, 31 Jan 2021 22:14:47 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.06.2 0028
Transfer-Encoding
chunked
Access-Control-Allow-Methods
GET, POST, OPTIONS
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/x-javascript
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies

Redirect headers

Date
Sun, 31 Jan 2021 22:14:47 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.06.2 0028
Transfer-Encoding
chunked
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Connection
keep-alive
Pragma
no-cache
Last-Modified
Sun, 31 Jan 2021 22:14:47 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&ct=0100000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DK%2FHovedstaden&cb=0016&i2=0016b6eff25a0c99b60172bd7&ep=1634893380&vr=421&id=b3ypd5&i3=0016b6eff25a0c99b60172bd7%3A1641334487546%3A1612131287546%3A.tvtoday.de%3A1%3Atvspielf%3AD%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday%3Anoevent%3A1612131287546&n1=1&dntt=0&lt=1612131287547&ev=&cs=2nfa8k&mo=1&sr=71
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Fri, 31 Jan 2020 22:14:47 GMT
truncated
/
43 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

Request headers

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

Response headers

Content-Type
image/gif
neu-tvt-titel-neutral-11-2017,188926_issuemainimage_20.jpg
www.tvtoday.de/files/images/201711/2/
15 KB
15 KB
Image
General
Full URL
https://www.tvtoday.de/files/images/201711/2/neu-tvt-titel-neutral-11-2017,188926_issuemainimage_20.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
a1d3db8192b827a383ef379c9098656bc3c1d8fc7f7a4f92dbfd6d53ccc98378
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:14:22 GMT
last-modified
Fri, 24 Nov 2017 21:12:05 GMT
age
24
etag
"3a72-55ec101392411"
vary
x-requested-with
x-varnish
952660465 955755173
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
tv-today-scheine-75euro-mit-stoerer,206997_issueproductimage_100.jpg
www.tvtoday.de/files/images/201901/2/
4 KB
4 KB
Image
General
Full URL
https://www.tvtoday.de/files/images/201901/2/tv-today-scheine-75euro-mit-stoerer,206997_issueproductimage_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
331b05ab63a9fc51ff711345c41007cd9e450ab4ba93d623d2455df04878e5b9
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:55:26 GMT
last-modified
Tue, 29 Jan 2019 11:05:01 GMT
age
1160
etag
"1013-58096c3c68a2d"
vary
x-requested-with
x-varnish
933559096 941627660
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
2b652e5.js
www.tvtoday.de/js/
25 KB
8 KB
Script
General
Full URL
https://www.tvtoday.de/js/2b652e5.js?10.499
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
22f138e2189f2659b3f920aaf4cb81963493984091199acf38dbb3db7be3235d
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:58:27 GMT
content-encoding
br
last-modified
Thu, 15 Nov 2018 08:42:47 GMT
age
979
etag
W/"6449-57ab008ffd773-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
942303278 942303227, 942666339 944935371
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
application/javascript
live-tv-small.png
www.tvtoday.de/bundles/frontend/images/
17 KB
17 KB
Image
General
Full URL
https://www.tvtoday.de/bundles/frontend/images/live-tv-small.png
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/css/dfdd70c.css?10.499
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
7d2f2875cdf32b9c50856aba00226b12b9b0c6a6af0862d734636b53a622375d
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Referer
https://www.tvtoday.de/css/dfdd70c.css?10.499
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sun, 31 Jan 2021 21:30:24 GMT
last-modified
Thu, 18 Jul 2019 12:45:49 GMT
age
2663
etag
"42fc-58df3fd40da22"
vary
x-requested-with
x-varnish
912421635 938142231
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/png
truncated
/
698 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
d7414b3a412e2829b3c6a846fbf3038ee39bb472d77fba00a79632d41c2fea88

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
2 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
28645074de9b2587a42c2317b5876b375d933409b068567bb62d26e7316f6510

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
856 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
85cda4d55bcace5081124025c8f8a4d9ed4bebc5ef464e9aa880c84f7cb9783c

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
596 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
d4139cbcf4017cb369059548b41fe657c0d0c24284cd3192f073a0d65059fa69

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
427 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
bf6433080882816ede69d3317d486fa7fd2b63995f0e3bc7971465221e058c99

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
1 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
dd11699e5bc91d667cc55e032cf45a9e599f3cebc0e3f71e2539e97ca8703d1f

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
298 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7a2e7a80d7542d5e8ae0beeb3abd52a5f0346c99cca5ffa4c0f222699abfe64d

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
1 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
d033f3bf9adb39b1aded5345a6731e4cf70ef85f0019b32464ebe55714c5a4cd

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
1 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9ce49a6036072f670176d60dfcd39ccfb8458af1f72af91cf028ef7d8c81570a

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
1 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9d70d6b5316518c3a8856a3655156437e00baefd015180efabc83cd42302cced

Request headers

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

Response headers

Content-Type
image/svg+xml
collect
www.google-analytics.com/j/
4 B
390 B
XHR
General
Full URL
https://www.google-analytics.com/j/collect?v=1&_v=j87&aip=1&a=619600064&t=pageview&_s=1&dl=https%3A%2F%2Fwww.tvtoday.de%2F&ul=en-us&de=UTF-8&dt=Das%20aktuelle%20Fernsehprogramm%20im%20%C3%9Cberblick%20von%20TV%20TODAY&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&_u=YEBAAEABAAAAAC~&jid=1576212692&gjid=1952992538&cid=1781516874.1612131288&tid=UA-1909021-1&_gid=289073915.1612131288&_r=1&_slc=1&cd4=0&z=257234275
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:811::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
aec60bc104db041b1512185839f18f52986df7e569e5445f740dd60f763fbca8
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Sun, 31 Jan 2021 22:14:47 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
content-type
text/plain
access-control-allow-origin
https://www.tvtoday.de
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
4
expires
Fri, 01 Jan 1990 00:00:00 GMT
ima3.js
s0.2mdn.net/instream/html5/
316 KB
109 KB
Script
General
Full URL
https://s0.2mdn.net/instream/html5/ima3.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/js/tfm.videopkg.min.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:816::2006 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
fdcb7fa1bc76eb0697f35276b4b7a9a0474a9cd6ce0d64db8d055a673473ac86
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:14:47 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
cache-control
private, max-age=900
cross-origin-resource-policy
cross-origin
accept-ranges
bytes
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
111290
x-xss-protection
0
expires
Sun, 31 Jan 2021 22:14:47 GMT
native-message
cmp.tvtoday.de/wrapper/tcfv2/v1/gdpr/ Frame
0
0
Other
General
Full URL
https://cmp.tvtoday.de/wrapper/tcfv2/v1/gdpr/native-message?requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&hasCsp=true&env=prod&consentLanguage=de&body=%7B%22accountId%22%3A217%2C%22requestUUID%22%3A%2264f4f008-d317-49b5-9447-fd57a55443b0%22%2C%22propertyHref%22%3A%22https%3A%2F%2Fwww.tvtoday.de%2F%22%2C%22euconsent%22%3Anull%2C%22meta%22%3A%22%7B%5C%22mmsCookies%5C%22%3A%5B%5D%2C%5C%22resolved%5C%22%3Anull%7D%22%2C%22clientMMSOrigin%22%3A%22https%3A%2F%2Fcmp.tvtoday.de%22%2C%22targetingParams%22%3A%22%7B%5C%22test%5C%22%3A1%7D%22%2C%22campaignEnv%22%3A%22prod%22%2C%22pubData%22%3A%7B%7D%7D
Protocol
H2
Server
65.9.58.127 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
/ Express
Resource Hash

Request headers

Accept
*/*
Access-Control-Request-Method
GET
Access-Control-Request-Headers
content-type
Origin
https://www.tvtoday.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

content-type
text/html; charset=utf-8
content-length
13
date
Sun, 31 Jan 2021 22:14:47 GMT
x-powered-by
Express
access-control-allow-origin
https://www.tvtoday.de
access-control-allow-credentials
true
access-control-allow-headers
Origin,X-Requested-With,Content-Type,Accept,Authorization,SP_SCRIPT_VERSION
access-control-allow-methods
GET, PUT, POST, DELETE
cache-control
no-cache, no-store
allow
POST,GET,HEAD
vary
Accept-Encoding
x-cache
Miss from cloudfront
via
1.1 e39402e2cf62b31f7774452c905f38f3.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C1
x-amz-cf-id
FpZfYT6VTa9dTlDeQuJOF1N3U4gAQCKFY6H1VRxbe19Cui5K3Rf8og==
native-message
cmp.tvtoday.de/wrapper/tcfv2/v1/gdpr/
44 KB
6 KB
XHR
General
Full URL
https://cmp.tvtoday.de/wrapper/tcfv2/v1/gdpr/native-message?requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&hasCsp=true&env=prod&consentLanguage=de&body=%7B%22accountId%22%3A217%2C%22requestUUID%22%3A%2264f4f008-d317-49b5-9447-fd57a55443b0%22%2C%22propertyHref%22%3A%22https%3A%2F%2Fwww.tvtoday.de%2F%22%2C%22euconsent%22%3Anull%2C%22meta%22%3A%22%7B%5C%22mmsCookies%5C%22%3A%5B%5D%2C%5C%22resolved%5C%22%3Anull%7D%22%2C%22clientMMSOrigin%22%3A%22https%3A%2F%2Fcmp.tvtoday.de%22%2C%22targetingParams%22%3A%22%7B%5C%22test%5C%22%3A1%7D%22%2C%22campaignEnv%22%3A%22prod%22%2C%22pubData%22%3A%7B%7D%7D
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.127 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
/ Express
Resource Hash
7fbc6e423bc418ef72eb926ea7cf3f00fcf85a0dfa0214f75f3d33d982e27bd3

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
application/json

Response headers

date
Sun, 31 Jan 2021 22:14:47 GMT
content-encoding
gzip
x-amz-cf-pop
FRA56-C1
x-powered-by
Express
vary
Accept-Encoding
access-control-allow-methods
GET, PUT, POST, DELETE
content-type
application/json; charset=utf-8
access-control-allow-origin
https://www.tvtoday.de
cache-control
no-cache, no-store
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept, Authorization, SP_SCRIPT_VERSION
x-amz-cf-id
sCEN81AFd1Rq8vyJIfedUC6EMIdI2PmqwEuu6qB9AT2XJA6tGdMcqA==
via
1.1 e39402e2cf62b31f7774452c905f38f3.cloudfront.net (CloudFront)
collect
stats.g.doubleclick.net/j/
1 B
443 B
XHR
General
Full URL
https://stats.g.doubleclick.net/j/collect?t=dc&aip=1&_r=3&v=1&_v=j87&tid=UA-1909021-1&cid=1781516874.1612131288&jid=1576212692&gjid=1952992538&_gid=289073915.1612131288&_u=YEBAAEAAAAAAAC~&z=893932857
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c00::9a Brussels, Belgium, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
strict-transport-security
max-age=10886400; includeSubDomains; preload
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
date
Sun, 31 Jan 2021 22:14:47 GMT
content-type
text/plain
access-control-allow-origin
https://www.tvtoday.de
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
1
expires
Fri, 01 Jan 1990 00:00:00 GMT
truncated
/
42 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
c90cff659645a312a28804965f3dbc34061338f7234ff5d6ddb2c57e9eadec15

Request headers

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

Response headers

Content-Type
image/webp
sprite_web_optimized_1608300055.webp
a2.tvspielfilm.de/images/tv/sender/mini/
202 KB
202 KB
Image
General
Full URL
https://a2.tvspielfilm.de/images/tv/sender/mini/sprite_web_optimized_1608300055.webp
Requested by
Host: a2.tvspielfilm.de
URL: https://a2.tvspielfilm.de/images/tv/sender/mini/channel_webp_optimized.css
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.20.143.13 , Ascension Island, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-20-143-13.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
447b290e7282540ce73a197fc7583f6f3baad9e1b622e1febf215398e523b7bc
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Referer
https://a2.tvspielfilm.de/images/tv/sender/mini/channel_webp_optimized.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

strict-transport-security
max-age=15768000
last-modified
Fri, 18 Dec 2020 14:00:59 GMT
server
Apache
etag
"32706-5b6bd89b6990a"
content-type
image/webp
access-control-allow-origin
*
cache-control
public, max-age=1195741, s-maxage=2592001
date
Sun, 31 Jan 2021 22:14:47 GMT
accept-ranges
bytes
content-length
206598
config.js
www.tvtoday.de/app/js/
827 B
553 B
Script
General
Full URL
https://www.tvtoday.de/app/js/config.js?10.499
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
4c19e27257577988274813ad04b681ae1cc446201a8e36dc20f8d3022fa92257
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:01:17 GMT
content-encoding
br
last-modified
Thu, 05 Nov 2020 11:52:29 GMT
age
810
etag
W/"33b-5b35abafefa9a-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
942890212 944221810, 942892088 944709758
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
application/javascript
J3RiYyySpNWjwhM-yuppie-xeroxed-86,217986_artikel_100.jpg
images.tvtoday.de/files/images/255207/6/
68 B
278 B
Image
General
Full URL
https://images.tvtoday.de/files/images/255207/6/J3RiYyySpNWjwhM-yuppie-xeroxed-86,217986_artikel_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

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

Response headers

pragma
no-cache
date
Sun, 31 Jan 2021 22:14:47 GMT
last-modified
Sun, 31 Jan 2021 22:14:47 GMT
age
0
x-varnish
942892089
cache-control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private
accept-ranges
bytes
content-type
image/png
expires
0
main.js
www.tvtoday.de/app/js/
452 KB
123 KB
Script
General
Full URL
https://www.tvtoday.de/app/js/main.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
35539ddad96cfb13bb97b51fde24fbb89329480259928e0190d754a70bbe3ed9
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:42:42 GMT
content-encoding
br
last-modified
Mon, 06 Jul 2020 08:53:23 GMT
age
1925
etag
W/"71134-5a9c201d835a5-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
942887564 943476603, 942892091 941575063
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
application/javascript
J3RiYyySpNWjwhMFTtCjrORlxyRnJQHZDkvMnegIpbwqpJWqcreT8uQdjUlU4xkeT8f.png
uobsoe.com/img/promotools/
68 B
242 B
Image
General
Full URL
https://uobsoe.com/img/promotools/J3RiYyySpNWjwhMFTtCjrORlxyRnJQHZDkvMnegIpbwqpJWqcreT8uQdjUlU4xkeT8f.png
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.25.120 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
api.addefend.com
Software
nginx /
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

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

Response headers

Date
Sun, 31 Jan 2021 22:14:48 GMT
Cache-Control
no-cache, private
Server
nginx
Connection
keep-alive
Content-Length
68
Content-Type
image/png
index.html
cmp.tvtoday.de/ Frame 48D1
4 KB
2 KB
Document
General
Full URL
https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&preload_message=true&consentLanguage=de
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.127 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
03da065f9be8acf8e981c2e0d36522bdbfc47decc9fe5b8d4fb4fb404a5ec43a

Request headers

:method
GET
:authority
cmp.tvtoday.de
:scheme
https
:path
/index.html?message_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&preload_message=true&consentLanguage=de
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
same-site
sec-fetch-mode
navigate
sec-fetch-dest
iframe
referer
https://www.tvtoday.de/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
ioam2018=0016b6eff25a0c99b60172bd7:1641334487546:1612131287546:.tvtoday.de:2:tvspielf:D/T/R/H/W/-/-/Thema_Entertainment_tvtoday:noevent:1612131287546:dtvc6f; _ga=GA1.2.1781516874.1612131288; _gid=GA1.2.289073915.1612131288; _gat=1; consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8; iom_consent=0100000000&1612131288005
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Referer
https://www.tvtoday.de/

Response headers

content-type
text/html
last-modified
Thu, 28 Jan 2021 20:15:57 GMT
server
AmazonS3
content-encoding
gzip
date
Sun, 31 Jan 2021 22:08:26 GMT
etag
W/"fc6b99fa9c74e43091841c1e7b22aedc"
vary
Accept-Encoding
x-cache
Hit from cloudfront
via
1.1 a383f82b5d4e98bbd66535c2c4b20c9e.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C1
x-amz-cf-id
3jGH7g2N9fkBfDvdlff0BZgty5tWCMVimuK5pEPpatLtMOP0p4QKiQ==
age
383
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
39 B
717 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.17.35 Ashburn, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
c011fb98df01432b65f1566109bf13d604858bc3d765cb3482e24e98cdd6e92f

Request headers

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

Response headers

Date
Sun, 31 Jan 2021 22:14:49 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
445AF6092356DB9A
Content-Length
39
x-amz-id-2
JcL5pJ9VPHrmksR0IJ4T0b04m70BJoX3UTaX2MxI+YxoQ4kCjOSICyc0vfKqH9pugBMW1IKGwNY=
Last-Modified
Sun, 31 Jan 2021 22:14:04 GMT
Server
AmazonS3
ETag
"f6a437a4ad479f664727f75e17d0531a"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://www.tvtoday.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
Thu, 01 Jan 1970 00:00:00 GMT
homad_clienConfig.json
www.tvtoday.de/js/
291 B
393 B
XHR
General
Full URL
https://www.tvtoday.de/js/homad_clienConfig.json
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
471b15c341415f023cd5387eb0bd4626883d010312f7b2a12f184613bda3f7df
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:07:19 GMT
content-encoding
br
last-modified
Mon, 01 Apr 2019 12:21:25 GMT
age
4048
etag
W/"123-585770f266684-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
940343142 938998425, 942666342 944083722
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
application/json
546a818fe4b03c03eae5f0fb_780.jpg
images.tvtoday.de/itv/2021-01-31/
25 KB
26 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-31/546a818fe4b03c03eae5f0fb_780.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
6668173a26e386c46c209eb428bb5c71223725118705f1cec27961e76a87542c
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:14:41 GMT
last-modified
Mon, 18 Jan 2021 03:33:01 GMT
age
6
etag
"65e6-5b924611044f0"
vary
x-requested-with
x-varnish
942666343 945162067
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
jurassic-world-neue-abenteuer,230621_tm_100.jpg
images.tvtoday.de/files/images/202101/1/
15 KB
16 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/202101/1/jurassic-world-neue-abenteuer,230621_tm_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
f56e62cc728881f7a85d94b689685f0095106ae0b3a8a344709abcefcea262fc
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:05:45 GMT
last-modified
Sun, 31 Jan 2021 09:01:23 GMT
age
542
etag
"3db0-5ba2e7b4b8ced"
vary
x-requested-with
x-varnish
953868991 954021954
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
dreamygo,230616_tm_100.jpg
images.tvtoday.de/files/images/202101/1/
9 KB
10 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/202101/1/dreamygo,230616_tm_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
0a5831440f66b5fdb994c860ca64e766c421c79c504ba57f1dcf5b49c85c52c0
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:02:07 GMT
last-modified
Sun, 31 Jan 2021 07:01:24 GMT
age
760
etag
"2554-5ba2cce3a4319"
vary
x-requested-with
x-varnish
945618442 954576010
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
omar-sy,230610_tm_100.jpg
images.tvtoday.de/files/images/202101/1/
10 KB
10 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/202101/1/omar-sy,230610_tm_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
50e59b43cf21b2bf563fb5778b6e4f358e698a0438b5a1098edd4d35be7ce4d9
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:08:47 GMT
last-modified
Sat, 30 Jan 2021 11:00:53 GMT
age
360
etag
"27d3-5ba1c08d6f673"
vary
x-requested-with
x-varnish
943764840 943802127
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
config.json
hgc-cf-cache-1.svonm.com/www.tvtoday.de/
234 B
1014 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.tvtoday.de/config.json
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
143.204.93.40 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-93-40.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
9123226279b709b6da55233220826f2b547d859f2d3345a8692b463c6241ba95

Request headers

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

Response headers

Date
Sun, 31 Jan 2021 22:14:40 GMT
Via
1.1 632ee301c4920b52f2463aa9e978c57f.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
15
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
234
Last-Modified
Thu, 10 Dec 2020 14:24:55 GMT
Server
AmazonS3
ETag
"dc4b4aa306c40f72c16c5e96ff796412"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://www.tvtoday.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Amz-Cf-Pop
FRA50-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
vsvi1aKZjrfT7OUTAULgD509kuR_B9eBB0WsWbCoeYAZMWHCO5AaXQ==
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Notice.16489.css
cmp.tvtoday.de/ Frame 48D1
28 KB
5 KB
Stylesheet
General
Full URL
https://cmp.tvtoday.de/Notice.16489.css
Requested by
Host: cmp.tvtoday.de
URL: https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&preload_message=true&consentLanguage=de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.127 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
4fd413be818cadcb46c36f2bc05d65d5970a6b1b29bf01021a1609151b9810ee

Request headers

Referer
https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&preload_message=true&consentLanguage=de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sun, 31 Jan 2021 21:16:20 GMT
content-encoding
gzip
last-modified
Thu, 28 Jan 2021 20:15:57 GMT
server
AmazonS3
age
3509
etag
W/"9483f9a765c613b1a84d99c0aebd209d"
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
text/css
via
1.1 a383f82b5d4e98bbd66535c2c4b20c9e.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C1
x-amz-cf-id
LroPa7-Ga_srf3hGfxuzCjeVw-l3UzD7AevGxI2t-vWim1III0BdVw==
polyfills.ede70.js
cmp.tvtoday.de/ Frame 48D1
5 KB
2 KB
Script
General
Full URL
https://cmp.tvtoday.de/polyfills.ede70.js
Requested by
Host: cmp.tvtoday.de
URL: https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&preload_message=true&consentLanguage=de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.127 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
533b23c57b1770cc3ee9c15b998b2eb494fa0adb2d6929fd22a9b78adfade3a7

Request headers

Referer
https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&preload_message=true&consentLanguage=de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sun, 31 Jan 2021 21:16:45 GMT
content-encoding
gzip
last-modified
Thu, 28 Jan 2021 20:15:57 GMT
server
AmazonS3
age
3484
etag
W/"89661b8fd918815bcb224bba79cabab1"
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
via
1.1 a383f82b5d4e98bbd66535c2c4b20c9e.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C1
x-amz-cf-id
HK8CIdzGqi4MwpQ7WwvVF0ZB-rXSId1L1xSuzfu_RfUb80VuiQ_tGQ==
Notice.d391c.js
cmp.tvtoday.de/ Frame 48D1
163 KB
40 KB
Script
General
Full URL
https://cmp.tvtoday.de/Notice.d391c.js
Requested by
Host: cmp.tvtoday.de
URL: https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&preload_message=true&consentLanguage=de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.127 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
53a653cd123dfae9383c014be06ee2a27d8c32b325d9ac7d96a55c3f2969a960

Request headers

Referer
https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&preload_message=true&consentLanguage=de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sun, 31 Jan 2021 22:08:37 GMT
content-encoding
gzip
last-modified
Thu, 28 Jan 2021 20:15:57 GMT
server
AmazonS3
age
372
etag
W/"719eafb20ea9af1956e12413a9eab5f4"
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
via
1.1 a383f82b5d4e98bbd66535c2c4b20c9e.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C1
x-amz-cf-id
4nGDiRznSPcL9EBSfokV_GFnZ7AlOb3YejAgDMCTrQYshSUImZhx4Q==
/
d2p3zdq8vjvnxd.cloudfront.net/ Frame 48D1
26 B
366 B
Image
General
Full URL
https://d2p3zdq8vjvnxd.cloudfront.net/?s_id=4176&m_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2600:9000:206f:ac00:13:7ad6:7840:21 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
3b7b8a4b411ddf8db9bacc2f3aabf406f8e4c0c087829b336ca331c40adfdff1

Request headers

Referer
https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&preload_message=true&consentLanguage=de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sun, 31 Jan 2021 22:14:49 GMT
via
1.1 910fc18161f0602555cc5b6397ca26f3.cloudfront.net (CloudFront)
last-modified
Wed, 10 Apr 2019 18:39:37 GMT
server
AmazonS3
x-amz-cf-pop
FRA56-C1
etag
"6a43099d5c8fe991a7aa7ebaca53069d"
x-cache
Miss from cloudfront
content-type
image/gif
cache-control
no-cache,no-store
accept-ranges
bytes
content-length
26
x-amz-cf-id
96RmgK2au5C1Zmu0dePdHnlfNfE3zeNazyTn-RyJTJBuUIDY0xcuQQ==
noun_Security_2839859.png
p5.focus.de/fol/multimedia/consentlayer/ Frame 48D1
24 KB
25 KB
Image
General
Full URL
https://p5.focus.de/fol/multimedia/consentlayer/noun_Security_2839859.png
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:6c00::210:bb29 , Ascension Island, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
Software
Akamai Image Manager /
Resource Hash
c89104ea547c4d58aeb92299465633b25ee3c1c9348c0e0b5ec471a34588c1c6

Request headers

Referer
https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&preload_message=true&consentLanguage=de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sun, 31 Jan 2021 22:14:48 GMT
last-modified
Thu, 16 Jul 2020 09:08:26 GMT
server
Akamai Image Manager
etag
"5f1016fa-fc9f"
content-type
image/webp
access-control-allow-origin
*
cache-control
no-transform, max-age=31535989
content-length
24876
expires
Mon, 31 Jan 2022 22:14:37 GMT
/
ssl.2.damoh.tvtoday.de/8ab94c584631fca5ad9c17beb7124bb6a66670fe/
247 KB
76 KB
XHR
General
Full URL
https://ssl.2.damoh.tvtoday.de/8ab94c584631fca5ad9c17beb7124bb6a66670fe/
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.3.103 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.103.3.251.148.clients.your-server.de
Software
AmazonS3 /
Resource Hash
ba978af8a14e6a1abc2112e0e981ed4d1bdaaac1aa643ec12effe21f14eb983e

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Sun, 31 Jan 2021 22:14:48 GMT
Content-Encoding
gzip
Connection
keep-alive
Content-Length
76893
Last-Modified
Tue, 26 Jan 2021 10:50:19 GMT
Server
AmazonS3
Etag
W/"36c376b7a253e0487e1ac4e0324ad42d"
Vary
Accept-Encoding, Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/javascript; charset=UTF-8
Access-Control-Allow-Origin
https://www.tvtoday.de
Access-Control-Expose-Headers
Date, X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
X-Homad-Instance
de20-homad-2
X-Homad-Url
https://hgc-cf-cache-1.svonm.com/hd-main.js
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
collect
www.google-analytics.com/
35 B
122 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j87&aip=1&a=619600064&t=timing&_s=2&dl=https%3A%2F%2Fwww.tvtoday.de%2F&ul=en-us&de=UTF-8&dt=Das%20aktuelle%20Fernsehprogramm%20im%20%C3%9Cberblick%20von%20TV%20TODAY&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&plt=1117&pdt=50&dns=6&rrt=74&srt=38&tcp=68&dit=700&clt=700&_gst=293&_gbt=475&_u=YEBAAEABAAAAAC~&jid=&gjid=&cid=1781516874.1612131288&tid=UA-1909021-1&_gid=289073915.1612131288&cd4=0&z=1387654186
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:811::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

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

Response headers

pragma
no-cache
date
Sun, 31 Jan 2021 19:04:33 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
11415
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
truncated
/
247 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
ba978af8a14e6a1abc2112e0e981ed4d1bdaaac1aa643ec12effe21f14eb983e

Request headers

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

Response headers

Content-Type
text/javascript
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
39 B
717 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=2952033103
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.17.35 Ashburn, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
c011fb98df01432b65f1566109bf13d604858bc3d765cb3482e24e98cdd6e92f

Request headers

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

Response headers

Date
Sun, 31 Jan 2021 22:14:49 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
A1FD4B8937CB7707
Content-Length
39
x-amz-id-2
ZcSmpyMjafyEP9ove1u+MGFQvfgWjqAwS/j4NvHNwVHO8Nz88kFEUfBta1sw7NiUQYC+Wr8K1FE=
Last-Modified
Sun, 31 Jan 2021 22:14:04 GMT
Server
AmazonS3
ETag
"f6a437a4ad479f664727f75e17d0531a"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://www.tvtoday.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
Thu, 01 Jan 1970 00:00:00 GMT
homad_clienConfig.json
www.tvtoday.de/js/
291 B
393 B
XHR
General
Full URL
https://www.tvtoday.de/js/homad_clienConfig.json?cache=2555154241
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
471b15c341415f023cd5387eb0bd4626883d010312f7b2a12f184613bda3f7df
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:07:19 GMT
content-encoding
br
last-modified
Mon, 01 Apr 2019 12:21:25 GMT
age
4049
etag
W/"123-585770f266684-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
940343142 938998425, 941678402 944083722
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
application/json
config.json
hgc-cf-cache-1.svonm.com/www.tvtoday.de/
234 B
1014 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.tvtoday.de/config.json?cache=1053889488
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
143.204.93.40 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-93-40.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
9123226279b709b6da55233220826f2b547d859f2d3345a8692b463c6241ba95

Request headers

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

Response headers

Date
Sun, 31 Jan 2021 22:14:40 GMT
Via
1.1 632ee301c4920b52f2463aa9e978c57f.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
15
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
234
Last-Modified
Thu, 10 Dec 2020 14:24:55 GMT
Server
AmazonS3
ETag
"dc4b4aa306c40f72c16c5e96ff796412"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://www.tvtoday.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Amz-Cf-Pop
FRA50-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
_nUkALyQdwWm6vdgn4B5cXFYFhD2Ehx3WyfUqh6RbhYn_Qokqp9trA==
Expires
Thu, 01 Jan 1970 00:00:00 GMT
/
ssl.2.damoh.tvtoday.de/68b5510d63f30f47935bf3ebaf5dcb32104fa6ab/
234 B
1 KB
XHR
General
Full URL
https://ssl.2.damoh.tvtoday.de/68b5510d63f30f47935bf3ebaf5dcb32104fa6ab/
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.3.103 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.103.3.251.148.clients.your-server.de
Software
AmazonS3 /
Resource Hash
9123226279b709b6da55233220826f2b547d859f2d3345a8692b463c6241ba95

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Sun, 31 Jan 2021 22:14:49 GMT
Connection
keep-alive
Content-Length
234
Last-Modified
Thu, 10 Dec 2020 14:24:55 GMT
Server
AmazonS3
Etag
"dc4b4aa306c40f72c16c5e96ff796412"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://www.tvtoday.de
Access-Control-Expose-Headers
Date, X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Homad-Instance
de20-homad-2
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.tvtoday.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
Thu, 01 Jan 1970 00:00:00 GMT
hic_qos
ssl.1.damoh.tvtoday.de/
24 B
356 B
Script
General
Full URL
https://ssl.1.damoh.tvtoday.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
Requested by
Host: text
URL: data:text/javascript;base64,KGZ1bmN0aW9uKCkge2Z1bmN0aW9uIGVhKGspe3ZhciBuPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG48ay5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6a1tuKytdfTp7ZG9uZTohMH19fXZhciBoYT0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnRpZXM/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKGssbix4KXtrIT1BcnJheS5wcm90b3R5cGUmJmshPU9iamVjdC5wcm90b3R5cGUmJihrW25dPXgudmFsdWUpfTtmdW5jdGlvbiBGYShrKXtrPVsib2JqZWN0Ij09dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbCxrXTtmb3IodmFyIG49MDtuPGsubGVuZ3RoOysrbil7dmFyIHg9a1tuXTtpZih4JiZ4Lk1hdGg9PU1hdGgpcmV0dXJuIHh9dGhyb3cgRXJyb3IoIkNhbm5vdCBmaW5kIGdsb2JhbCBvYmplY3QiKTt9CnZhciBRYT1GYSh0aGlzKTtmdW5jdGlvbiBVYSgpe1VhPWZ1bmN0aW9uKCl7fTtRYS5TeW1ib2x8fChRYS5TeW1ib2w9VmEpfWZ1bmN0aW9uIGpiKGssbil7dGhpcy5hPWs7aGEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pfWpiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9O3ZhciBWYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoeCl7aWYodGhpcyBpbnN0YW5jZW9mIGspdGhyb3cgbmV3IFR5cGVFcnJvcigiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIik7cmV0dXJuIG5ldyBqYigianNjb21wX3N5bWJvbF8iKyh4fHwiIikrIl8iK24rKyx4KX12YXIgbj0wO3JldHVybiBrfSgpOwpmdW5jdGlvbiB1Yigpe1VhKCk7dmFyIGs9UWEuU3ltYm9sLml0ZXJhdG9yO2t8fChrPVFhLlN5bWJvbC5pdGVyYXRvcj1RYS5TeW1ib2woIlN5bWJvbC5pdGVyYXRvciIpKTsiZnVuY3Rpb24iIT10eXBlb2YgQXJyYXkucHJvdG90eXBlW2tdJiZoYShBcnJheS5wcm90b3R5cGUsayx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHZiKGVhKHRoaXMpKX19KTt1Yj1mdW5jdGlvbigpe319ZnVuY3Rpb24gdmIoayl7dWIoKTtrPXtuZXh0Omt9O2tbUWEuU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtyZXR1cm4ga31mdW5jdGlvbiBFYihrKXt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZrW1N5bWJvbC5pdGVyYXRvcl07cmV0dXJuIG4/bi5jYWxsKGspOntuZXh0OmVhKGspfX0KZnVuY3Rpb24gRmIoayl7aWYoIShrIGluc3RhbmNlb2YgQXJyYXkpKXtrPUViKGspO2Zvcih2YXIgbix4PVtdOyEobj1rLm5leHQoKSkuZG9uZTspeC5wdXNoKG4udmFsdWUpO2s9eH1yZXR1cm4ga312YXIgUGI9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/T2JqZWN0LmNyZWF0ZTpmdW5jdGlvbihrKXtmdW5jdGlvbiBuKCl7fW4ucHJvdG90eXBlPWs7cmV0dXJuIG5ldyBufSxRYjtpZigiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LnNldFByb3RvdHlwZU9mKVFiPU9iamVjdC5zZXRQcm90b3R5cGVPZjtlbHNle3ZhciBSYjthOnt2YXIgU2I9e1VkOiEwfSxUYj17fTt0cnl7VGIuX19wcm90b19fPVNiO1JiPVRiLlVkO2JyZWFrIGF9Y2F0Y2goayl7fVJiPSExfVFiPVJiP2Z1bmN0aW9uKGssbil7ay5fX3Byb3RvX189bjtpZihrLl9fcHJvdG9fXyE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcihrKyIgaXMgbm90IGV4dGVuc2libGUiKTtyZXR1cm4ga306bnVsbH0KdmFyIFViPVFiO2Z1bmN0aW9uIHkoayxuKXtrLnByb3RvdHlwZT1QYihuLnByb3RvdHlwZSk7ay5wcm90b3R5cGUuY29uc3RydWN0b3I9aztpZihVYilVYihrLG4pO2Vsc2UgZm9yKHZhciB4IGluIG4paWYoInByb3RvdHlwZSIhPXgpaWYoT2JqZWN0LmRlZmluZVByb3BlcnRpZXMpe3ZhciBHPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix4KTtHJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoayx4LEcpfWVsc2Uga1t4XT1uW3hdfWZ1bmN0aW9uIG1jKGssbil7aWYobil7dmFyIHg9UWE7az1rLnNwbGl0KCIuIik7Zm9yKHZhciBHPTA7RzxrLmxlbmd0aC0xO0crKyl7dmFyIEs9a1tHXTtLIGluIHh8fCh4W0tdPXt9KTt4PXhbS119az1rW2subGVuZ3RoLTFdO0c9eFtrXTtuPW4oRyk7biE9RyYmbnVsbCE9biYmaGEoeCxrLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pfX0KbWMoIlByb21pc2UiLGZ1bmN0aW9uKGspe2Z1bmN0aW9uIG4odCl7dGhpcy5iPTA7dGhpcy5jPXZvaWQgMDt0aGlzLmE9W107dmFyIHE9dGhpcy5nKCk7dHJ5e3QocS5yZXNvbHZlLHEucmVqZWN0KX1jYXRjaChyKXtxLnJlamVjdChyKX19ZnVuY3Rpb24geCgpe3RoaXMuYT1udWxsfWZ1bmN0aW9uIEcodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBuP3Q6bmV3IG4oZnVuY3Rpb24ocSl7cSh0KX0pfWlmKGspcmV0dXJuIGs7eC5wcm90b3R5cGUuYj1mdW5jdGlvbih0KXtpZihudWxsPT10aGlzLmEpe3RoaXMuYT1bXTt2YXIgcT10aGlzO3RoaXMuZyhmdW5jdGlvbigpe3EuYygpfSl9dGhpcy5hLnB1c2godCl9O3ZhciBLPVFhLnNldFRpbWVvdXQ7eC5wcm90b3R5cGUuZz1mdW5jdGlvbih0KXtLKHQsMCl9O3gucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXtmb3IoO3RoaXMuYSYmdGhpcy5hLmxlbmd0aDspe3ZhciB0PXRoaXMuYTt0aGlzLmE9W107Zm9yKHZhciBxPTA7cTx0Lmxlbmd0aDsrK3Epe3ZhciByPQp0W3FdO3RbcV09bnVsbDt0cnl7cigpfWNhdGNoKHcpe3RoaXMuaSh3KX19fXRoaXMuYT1udWxsfTt4LnByb3RvdHlwZS5pPWZ1bmN0aW9uKHQpe3RoaXMuZyhmdW5jdGlvbigpe3Rocm93IHQ7fSl9O24ucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHcpe3JldHVybiBmdW5jdGlvbihJKXtyfHwocj0hMCx3LmNhbGwocSxJKSl9fXZhciBxPXRoaXMscj0hMTtyZXR1cm57cmVzb2x2ZTp0KHRoaXMuRikscmVqZWN0OnQodGhpcy5pKX19O24ucHJvdG90eXBlLkY9ZnVuY3Rpb24odCl7aWYodD09PXRoaXMpdGhpcy5pKG5ldyBUeXBlRXJyb3IoIkEgUHJvbWlzZSBjYW5ub3QgcmVzb2x2ZSB0byBpdHNlbGYiKSk7ZWxzZSBpZih0IGluc3RhbmNlb2Ygbil0aGlzLkIodCk7ZWxzZXthOnN3aXRjaCh0eXBlb2YgdCl7Y2FzZSAib2JqZWN0Ijp2YXIgcT1udWxsIT10O2JyZWFrIGE7Y2FzZSAiZnVuY3Rpb24iOnE9ITA7YnJlYWsgYTtkZWZhdWx0OnE9ITF9cT90aGlzLm8odCk6dGhpcy5mKHQpfX07Cm4ucHJvdG90eXBlLm89ZnVuY3Rpb24odCl7dmFyIHE9dm9pZCAwO3RyeXtxPXQudGhlbn1jYXRjaChyKXt0aGlzLmkocik7cmV0dXJufSJmdW5jdGlvbiI9PXR5cGVvZiBxP3RoaXMucyhxLHQpOnRoaXMuZih0KX07bi5wcm90b3R5cGUuaT1mdW5jdGlvbih0KXt0aGlzLmwoMix0KX07bi5wcm90b3R5cGUuZj1mdW5jdGlvbih0KXt0aGlzLmwoMSx0KX07bi5wcm90b3R5cGUubD1mdW5jdGlvbih0LHEpe2lmKDAhPXRoaXMuYil0aHJvdyBFcnJvcigiQ2Fubm90IHNldHRsZSgiK3QrIiwgIitxKyIpOiBQcm9taXNlIGFscmVhZHkgc2V0dGxlZCBpbiBzdGF0ZSIrdGhpcy5iKTt0aGlzLmI9dDt0aGlzLmM9cTt0aGlzLm0oKX07bi5wcm90b3R5cGUubT1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuYSl7Zm9yKHZhciB0PTA7dDx0aGlzLmEubGVuZ3RoOysrdClRLmIodGhpcy5hW3RdKTt0aGlzLmE9bnVsbH19O3ZhciBRPW5ldyB4O24ucHJvdG90eXBlLkI9ZnVuY3Rpb24odCl7dmFyIHE9dGhpcy5nKCk7CnQuc2MocS5yZXNvbHZlLHEucmVqZWN0KX07bi5wcm90b3R5cGUucz1mdW5jdGlvbih0LHEpe3ZhciByPXRoaXMuZygpO3RyeXt0LmNhbGwocSxyLnJlc29sdmUsci5yZWplY3QpfWNhdGNoKHcpe3IucmVqZWN0KHcpfX07bi5wcm90b3R5cGUudGhlbj1mdW5jdGlvbih0LHEpe2Z1bmN0aW9uIHIoVSxHYSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIFU/ZnVuY3Rpb24ocmEpe3RyeXt3KFUocmEpKX1jYXRjaChzYSl7SShzYSl9fTpHYX12YXIgdyxJLGJhPW5ldyBuKGZ1bmN0aW9uKFUsR2Epe3c9VTtJPUdhfSk7dGhpcy5zYyhyKHQsdykscihxLEkpKTtyZXR1cm4gYmF9O24ucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLHQpfTtuLnByb3RvdHlwZS5zYz1mdW5jdGlvbih0LHEpe2Z1bmN0aW9uIHIoKXtzd2l0Y2gody5iKXtjYXNlIDE6dCh3LmMpO2JyZWFrO2Nhc2UgMjpxKHcuYyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBzdGF0ZTogIisKdy5iKTt9fXZhciB3PXRoaXM7bnVsbD09dGhpcy5hP1EuYihyKTp0aGlzLmEucHVzaChyKX07bi5yZXNvbHZlPUc7bi5yZWplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKGZ1bmN0aW9uKHEscil7cih0KX0pfTtuLnJhY2U9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKGZ1bmN0aW9uKHEscil7Zm9yKHZhciB3PUViKHQpLEk9dy5uZXh0KCk7IUkuZG9uZTtJPXcubmV4dCgpKUcoSS52YWx1ZSkuc2MocSxyKX0pfTtuLmFsbD1mdW5jdGlvbih0KXt2YXIgcT1FYih0KSxyPXEubmV4dCgpO3JldHVybiByLmRvbmU/RyhbXSk6bmV3IG4oZnVuY3Rpb24odyxJKXtmdW5jdGlvbiBiYShyYSl7cmV0dXJuIGZ1bmN0aW9uKHNhKXtVW3JhXT1zYTtHYS0tOzA9PUdhJiZ3KFUpfX12YXIgVT1bXSxHYT0wO2RvIFUucHVzaCh2b2lkIDApLEdhKyssRyhyLnZhbHVlKS5zYyhiYShVLmxlbmd0aC0xKSxJKSxyPXEubmV4dCgpO3doaWxlKCFyLmRvbmUpfSl9O3JldHVybiBufSk7CmZ1bmN0aW9uIG5jKCl7dGhpcy5jPSExO3RoaXMuZz1udWxsO3RoaXMuYj12b2lkIDA7dGhpcy5hPTE7dGhpcy5sPTA7dGhpcy5pPW51bGx9ZnVuY3Rpb24gb2Moayl7aWYoay5jKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtrLmM9ITB9bmMucHJvdG90eXBlLmY9ZnVuY3Rpb24oayl7dGhpcy5iPWt9O2Z1bmN0aW9uIHBjKGssbil7ay5pPXtaZDpuLGhlOiEwfTtrLmE9ay5sfW5jLnByb3RvdHlwZS5yZXR1cm49ZnVuY3Rpb24oayl7dGhpcy5pPXtyZXR1cm46a307dGhpcy5hPXRoaXMubH07ZnVuY3Rpb24gcWMoayxuLHgpe2suYT14O3JldHVybnt2YWx1ZTpufX1mdW5jdGlvbiB6YyhrKXt0aGlzLmE9bmV3IG5jO3RoaXMuYj1rfQpmdW5jdGlvbiBBYyhrLG4pe29jKGsuYSk7dmFyIHg9ay5hLmc7aWYoeClyZXR1cm4gQmMoaywicmV0dXJuImluIHg/eFsicmV0dXJuIl06ZnVuY3Rpb24oRyl7cmV0dXJue3ZhbHVlOkcsZG9uZTohMH19LG4say5hLnJldHVybik7ay5hLnJldHVybihuKTtyZXR1cm4gQ2Moayl9ZnVuY3Rpb24gQmMoayxuLHgsRyl7dHJ5e3ZhciBLPW4uY2FsbChrLmEuZyx4KTtpZighKEsgaW5zdGFuY2VvZiBPYmplY3QpKXRocm93IG5ldyBUeXBlRXJyb3IoIkl0ZXJhdG9yIHJlc3VsdCAiK0srIiBpcyBub3QgYW4gb2JqZWN0Iik7aWYoIUsuZG9uZSlyZXR1cm4gay5hLmM9ITEsSzt2YXIgUT1LLnZhbHVlfWNhdGNoKHQpe3JldHVybiBrLmEuZz1udWxsLHBjKGsuYSx0KSxDYyhrKX1rLmEuZz1udWxsO0cuY2FsbChrLmEsUSk7cmV0dXJuIENjKGspfQpmdW5jdGlvbiBDYyhrKXtmb3IoO2suYS5hOyl0cnl7dmFyIG49ay5iKGsuYSk7aWYobilyZXR1cm4gay5hLmM9ITEse3ZhbHVlOm4udmFsdWUsZG9uZTohMX19Y2F0Y2goeCl7ay5hLmI9dm9pZCAwLHBjKGsuYSx4KX1rLmEuYz0hMTtpZihrLmEuaSl7bj1rLmEuaTtrLmEuaT1udWxsO2lmKG4uaGUpdGhyb3cgbi5aZDtyZXR1cm57dmFsdWU6bi5yZXR1cm4sZG9uZTohMH19cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX0KZnVuY3Rpb24gRGMoayl7dGhpcy5uZXh0PWZ1bmN0aW9uKG4pe29jKGsuYSk7ay5hLmc/bj1CYyhrLGsuYS5nLm5leHQsbixrLmEuZik6KGsuYS5mKG4pLG49Q2MoaykpO3JldHVybiBufTt0aGlzLnRocm93PWZ1bmN0aW9uKG4pe29jKGsuYSk7ay5hLmc/bj1CYyhrLGsuYS5nWyJ0aHJvdyJdLG4say5hLmYpOihwYyhrLmEsbiksbj1DYyhrKSk7cmV0dXJuIG59O3RoaXMucmV0dXJuPWZ1bmN0aW9uKG4pe3JldHVybiBBYyhrLG4pfTt1YigpO3RoaXNbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfX1mdW5jdGlvbiBFYyhrKXtmdW5jdGlvbiBuKEcpe3JldHVybiBrLm5leHQoRyl9ZnVuY3Rpb24geChHKXtyZXR1cm4gay50aHJvdyhHKX1yZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oRyxLKXtmdW5jdGlvbiBRKHQpe3QuZG9uZT9HKHQudmFsdWUpOlByb21pc2UucmVzb2x2ZSh0LnZhbHVlKS50aGVuKG4seCkudGhlbihRLEspfVEoay5uZXh0KCkpfSl9CmZ1bmN0aW9uIEZjKGspe3JldHVybiBFYyhuZXcgRGMobmV3IHpjKGspKSl9ZnVuY3Rpb24gR2MoayxuKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGssbil9Cm1jKCJXZWFrTWFwIixmdW5jdGlvbihrKXtmdW5jdGlvbiBuKHIpe3RoaXMuYT0ocSs9TWF0aC5yYW5kb20oKSsxKS50b1N0cmluZygpO2lmKHIpe3I9RWIocik7Zm9yKHZhciB3OyEodz1yLm5leHQoKSkuZG9uZTspdz13LnZhbHVlLHRoaXMuc2V0KHdbMF0sd1sxXSl9fWZ1bmN0aW9uIHgoKXt9ZnVuY3Rpb24gRyhyKXt2YXIgdz10eXBlb2YgcjtyZXR1cm4ib2JqZWN0Ij09PXcmJm51bGwhPT1yfHwiZnVuY3Rpb24iPT09d31mdW5jdGlvbiBLKHIpe2lmKCFHYyhyLHQpKXt2YXIgdz1uZXcgeDtoYShyLHQse3ZhbHVlOnd9KX19ZnVuY3Rpb24gUShyKXt2YXIgdz1PYmplY3Rbcl07dyYmKE9iamVjdFtyXT1mdW5jdGlvbihJKXtpZihJIGluc3RhbmNlb2YgeClyZXR1cm4gSTtLKEkpO3JldHVybiB3KEkpfSl9aWYoZnVuY3Rpb24oKXtpZigha3x8IU9iamVjdC5zZWFsKXJldHVybiExO3RyeXt2YXIgcj1PYmplY3Quc2VhbCh7fSksdz1PYmplY3Quc2VhbCh7fSksST1uZXcgayhbW3IsMl0sClt3LDNdXSk7aWYoMiE9SS5nZXQocil8fDMhPUkuZ2V0KHcpKXJldHVybiExO0kuZGVsZXRlKHIpO0kuc2V0KHcsNCk7cmV0dXJuIUkuaGFzKHIpJiY0PT1JLmdldCh3KX1jYXRjaChiYSl7cmV0dXJuITF9fSgpKXJldHVybiBrO3ZhciB0PSIkanNjb21wX2hpZGRlbl8iK01hdGgucmFuZG9tKCk7USgiZnJlZXplIik7USgicHJldmVudEV4dGVuc2lvbnMiKTtRKCJzZWFsIik7dmFyIHE9MDtuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24ocix3KXtpZighRyhyKSl0aHJvdyBFcnJvcigiSW52YWxpZCBXZWFrTWFwIGtleSIpO0socik7aWYoIUdjKHIsdCkpdGhyb3cgRXJyb3IoIldlYWtNYXAga2V5IGZhaWw6ICIrcik7clt0XVt0aGlzLmFdPXc7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLmdldD1mdW5jdGlvbihyKXtyZXR1cm4gRyhyKSYmR2Mocix0KT9yW3RdW3RoaXMuYV06dm9pZCAwfTtuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24ocil7cmV0dXJuIEcocikmJkdjKHIsdCkmJkdjKHJbdF0sCnRoaXMuYSl9O24ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihyKXtyZXR1cm4gRyhyKSYmR2Mocix0KSYmR2Moclt0XSx0aGlzLmEpP2RlbGV0ZSByW3RdW3RoaXMuYV06ITF9O3JldHVybiBufSk7Cm1jKCJNYXAiLGZ1bmN0aW9uKGspe2Z1bmN0aW9uIG4oKXt2YXIgcT17fTtyZXR1cm4gcS5ZYT1xLm5leHQ9cS5oZWFkPXF9ZnVuY3Rpb24geChxLHIpe3ZhciB3PXEuYTtyZXR1cm4gdmIoZnVuY3Rpb24oKXtpZih3KXtmb3IoO3cuaGVhZCE9cS5hOyl3PXcuWWE7Zm9yKDt3Lm5leHQhPXcuaGVhZDspcmV0dXJuIHc9dy5uZXh0LHtkb25lOiExLHZhbHVlOnIodyl9O3c9bnVsbH1yZXR1cm57ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fSl9ZnVuY3Rpb24gRyhxLHIpe3ZhciB3PXImJnR5cGVvZiByOyJvYmplY3QiPT13fHwiZnVuY3Rpb24iPT13P1EuaGFzKHIpP3c9US5nZXQocik6KHc9IiIrICsrdCxRLnNldChyLHcpKTp3PSJwXyIrcjt2YXIgST1xLmJbd107aWYoSSYmR2MocS5iLHcpKWZvcihxPTA7cTxJLmxlbmd0aDtxKyspe3ZhciBiYT1JW3FdO2lmKHIhPT1yJiZiYS5rZXkhPT1iYS5rZXl8fHI9PT1iYS5rZXkpcmV0dXJue2lkOncsbGlzdDpJLGluZGV4OnEsdWE6YmF9fXJldHVybntpZDp3LApsaXN0OkksaW5kZXg6LTEsdWE6dm9pZCAwfX1mdW5jdGlvbiBLKHEpe3RoaXMuYj17fTt0aGlzLmE9bigpO3RoaXMuc2l6ZT0wO2lmKHEpe3E9RWIocSk7Zm9yKHZhciByOyEocj1xLm5leHQoKSkuZG9uZTspcj1yLnZhbHVlLHRoaXMuc2V0KHJbMF0sclsxXSl9fWlmKGZ1bmN0aW9uKCl7aWYoIWt8fCJmdW5jdGlvbiIhPXR5cGVvZiBrfHwhay5wcm90b3R5cGUuZW50cmllc3x8ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5zZWFsKXJldHVybiExO3RyeXt2YXIgcT1PYmplY3Quc2VhbCh7eDo0fSkscj1uZXcgayhFYihbW3EsInMiXV0pKTtpZigicyIhPXIuZ2V0KHEpfHwxIT1yLnNpemV8fHIuZ2V0KHt4OjR9KXx8ci5zZXQoe3g6NH0sInQiKSE9cnx8MiE9ci5zaXplKXJldHVybiExO3ZhciB3PXIuZW50cmllcygpLEk9dy5uZXh0KCk7aWYoSS5kb25lfHxJLnZhbHVlWzBdIT1xfHwicyIhPUkudmFsdWVbMV0pcmV0dXJuITE7ST13Lm5leHQoKTtyZXR1cm4gSS5kb25lfHw0IT1JLnZhbHVlWzBdLnh8fAoidCIhPUkudmFsdWVbMV18fCF3Lm5leHQoKS5kb25lPyExOiEwfWNhdGNoKGJhKXtyZXR1cm4hMX19KCkpcmV0dXJuIGs7dWIoKTt2YXIgUT1uZXcgV2Vha01hcDtLLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24ocSxyKXtxPTA9PT1xPzA6cTt2YXIgdz1HKHRoaXMscSk7dy5saXN0fHwody5saXN0PXRoaXMuYlt3LmlkXT1bXSk7dy51YT93LnVhLnZhbHVlPXI6KHcudWE9e25leHQ6dGhpcy5hLFlhOnRoaXMuYS5ZYSxoZWFkOnRoaXMuYSxrZXk6cSx2YWx1ZTpyfSx3Lmxpc3QucHVzaCh3LnVhKSx0aGlzLmEuWWEubmV4dD13LnVhLHRoaXMuYS5ZYT13LnVhLHRoaXMuc2l6ZSsrKTtyZXR1cm4gdGhpc307Sy5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHEpe3E9Ryh0aGlzLHEpO3JldHVybiBxLnVhJiZxLmxpc3Q/KHEubGlzdC5zcGxpY2UocS5pbmRleCwxKSxxLmxpc3QubGVuZ3RofHxkZWxldGUgdGhpcy5iW3EuaWRdLHEudWEuWWEubmV4dD1xLnVhLm5leHQscS51YS5uZXh0LllhPXEudWEuWWEsCnEudWEuaGVhZD1udWxsLHRoaXMuc2l6ZS0tLCEwKTohMX07Sy5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmI9e307dGhpcy5hPXRoaXMuYS5ZYT1uKCk7dGhpcy5zaXplPTB9O0sucHJvdG90eXBlLmhhcz1mdW5jdGlvbihxKXtyZXR1cm4hIUcodGhpcyxxKS51YX07Sy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHEpe3JldHVybihxPUcodGhpcyxxKS51YSkmJnEudmFsdWV9O0sucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4geCh0aGlzLGZ1bmN0aW9uKHEpe3JldHVybltxLmtleSxxLnZhbHVlXX0pfTtLLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHgodGhpcyxmdW5jdGlvbihxKXtyZXR1cm4gcS5rZXl9KX07Sy5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHgodGhpcyxmdW5jdGlvbihxKXtyZXR1cm4gcS52YWx1ZX0pfTtLLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHEscil7Zm9yKHZhciB3PXRoaXMuZW50cmllcygpLApJOyEoST13Lm5leHQoKSkuZG9uZTspST1JLnZhbHVlLHEuY2FsbChyLElbMV0sSVswXSx0aGlzKX07Sy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1LLnByb3RvdHlwZS5lbnRyaWVzO3ZhciB0PTA7cmV0dXJuIEt9KTt2YXIgSGM9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbjpmdW5jdGlvbihrLG4pe2Zvcih2YXIgeD0xO3g8YXJndW1lbnRzLmxlbmd0aDt4Kyspe3ZhciBHPWFyZ3VtZW50c1t4XTtpZihHKWZvcih2YXIgSyBpbiBHKUdjKEcsSykmJihrW0tdPUdbS10pfXJldHVybiBrfTttYygiT2JqZWN0LmFzc2lnbiIsZnVuY3Rpb24oayl7cmV0dXJuIGt8fEhjfSk7bWMoIk9iamVjdC5pcyIsZnVuY3Rpb24oayl7cmV0dXJuIGs/azpmdW5jdGlvbihuLHgpe3JldHVybiBuPT09eD8wIT09bnx8MS9uPT09MS94Om4hPT1uJiZ4IT09eH19KTsKbWMoIkFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyIsZnVuY3Rpb24oayl7cmV0dXJuIGs/azpmdW5jdGlvbihuLHgpe3ZhciBHPXRoaXM7RyBpbnN0YW5jZW9mIFN0cmluZyYmKEc9U3RyaW5nKEcpKTt2YXIgSz1HLmxlbmd0aDt4PXh8fDA7Zm9yKDA+eCYmKHg9TWF0aC5tYXgoeCtLLDApKTt4PEs7eCsrKXt2YXIgUT1HW3hdO2lmKFE9PT1ufHxPYmplY3QuaXMoUSxuKSlyZXR1cm4hMH1yZXR1cm4hMX19KTsKbWMoIlN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMiLGZ1bmN0aW9uKGspe3JldHVybiBrP2s6ZnVuY3Rpb24obix4KXtpZihudWxsPT10aGlzKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSAndGhpcycgdmFsdWUgZm9yIFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgbXVzdCBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQiKTtpZihuIGluc3RhbmNlb2YgUmVnRXhwKXRocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IHRvIFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgbXVzdCBub3QgYmUgYSByZWd1bGFyIGV4cHJlc3Npb24iKTtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZihuLHh8fDApfX0pOwptYygiQXJyYXkuZnJvbSIsZnVuY3Rpb24oayl7cmV0dXJuIGs/azpmdW5jdGlvbihuLHgsRyl7eD1udWxsIT14P3g6ZnVuY3Rpb24ocSl7cmV0dXJuIHF9O3ZhciBLPVtdLFE9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmbltTeW1ib2wuaXRlcmF0b3JdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBRKXtuPVEuY2FsbChuKTtmb3IodmFyIHQ9MDshKFE9bi5uZXh0KCkpLmRvbmU7KUsucHVzaCh4LmNhbGwoRyxRLnZhbHVlLHQrKykpfWVsc2UgZm9yKFE9bi5sZW5ndGgsdD0wO3Q8UTt0KyspSy5wdXNoKHguY2FsbChHLG5bdF0sdCkpO3JldHVybiBLfX0pOwooZnVuY3Rpb24oKXtmdW5jdGlvbiBrKCl7dGhpcy5vPXRoaXMuZz10aGlzLmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmY9MDt0aGlzLmM9IiI7dGhpcy5sPSExfWZ1bmN0aW9uIG4oYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIHgoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5zPSExO3JldHVybiBhfWZ1bmN0aW9uIEcoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIEsoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIFEoYSxjKXtyZXR1cm4gRS5jYWxsKHRoaXMsYSxjKXx8dGhpc31mdW5jdGlvbiB0KGEpe3JldHVybiBBLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBxKGEpe3JldHVybiBGLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiByKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuUz0hMTthLks9MTA7YS5OPSExO2EuSWE9ITE7YS5PPSExO2EuUD0hMTthLnM9MDthLnU9ITE7CmEuY2E9bC5zKDEwKTthLlg9ITE7YS5jPSExO2EuWj0hMTtyZXR1cm4gYX1mdW5jdGlvbiB3KGEpe3JldHVybiBBLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBJKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5sPS0xO3JldHVybiBhfWZ1bmN0aW9uIGJhKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuWD0hMTthLm89ITE7YS5pc1BsYXlpbmc9ITE7YS5mPTA7YS5zPSExO3JldHVybiBhfWZ1bmN0aW9uIFUoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmY9ITE7YS5sPTA7YS51PTA7YS5kdXJhdGlvbj0wO2EubT0hMTtyZXR1cm4gYX1mdW5jdGlvbiBHYShhKXtyZXR1cm4gRi5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gcmEoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5BPSExO2Eucz0hMTthLk09ITE7cmV0dXJuIGF9ZnVuY3Rpb24gc2EoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmY9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gVmIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLAphKXx8dGhpc31mdW5jdGlvbiB3YihhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLlg9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gV2EoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmY9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gV2IoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIFhhKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuWD0hMTthLnBhcmVudD1udWxsO2EuYz17fTtyZXR1cm4gYX1mdW5jdGlvbiBSYShhKXthPUEuY2FsbCh0aGlzLGEpfHx0aGlzO2EuZj1udWxsO3JldHVybiBhfWZ1bmN0aW9uIFhiKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5jPSExO3JldHVybiBhfWZ1bmN0aW9uIEdiKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuYz0iIjtyZXR1cm4gYX1mdW5jdGlvbiBLYShhKXtyZXR1cm4gQS5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24geGIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIFlhKGEsCmMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLm89ITE7cmV0dXJuIGF9ZnVuY3Rpb24gU2EoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLkxhPSExO3ZvaWQgMD09YS5mJiYoYS5mPSExKTtyZXR1cm4gYX1mdW5jdGlvbiBZYihhKXtyZXR1cm4gRi5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gSGIoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5mPTA7YS5vPTEwO3JldHVybiBhfWZ1bmN0aW9uIHlhKGEpe2E9QS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5mPTA7cmV0dXJuIGF9ZnVuY3Rpb24gWmIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGtiKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuYz1bXTthLmY9ITE7YS5vPSExO3JldHVybiBhfWZ1bmN0aW9uIExhKGEpe2E9QS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5MYT0hMTtyZXR1cm4gYX1mdW5jdGlvbiAkYihhKXtyZXR1cm4gRi5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gSWIoYSwKYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2Eubz0hMTthLmM9MDtyZXR1cm4gYX1mdW5jdGlvbiBxYShhKXthPUEuY2FsbCh0aGlzLGEpfHx0aGlzO2EuZj0hMTthLm09ITE7YS5CPSExO2EubD1bXTthLnM9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gSmIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGFjKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gWmEoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLm11dGVkPSExO3JldHVybiBhfWZ1bmN0aW9uIHJjKCl7dGEuc3x8KHRhLnM9MCk7dGEucysrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9dGEuQSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT10YS5BKTsxMD50YS5zJiZ3aW5kb3cuc2V0VGltZW91dChyYyw1MDApfWZ1bmN0aW9uIGNiKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5zPTA7YS5jPVtdO2EubT1bXTthLm89W107cmV0dXJuIGF9ZnVuY3Rpb24geWIoYSwKYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gJGEoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGJjKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5jPSExO3JldHVybiBhfWZ1bmN0aW9uIGNjKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gZGIoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIEtiKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5tPSExO3JldHVybiBhfWZ1bmN0aW9uIHpiKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gSGEoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGRjKGEpe3JldHVybiBGLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBNYShhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLnM9ITE7YS5BPSExO2EuTj0hMTthLnU9ITE7YS5EPSExO2EuYz0hMTtyZXR1cm4gYX1mdW5jdGlvbiB6YShhKXtyZXR1cm4gQS5jYWxsKHRoaXMsCmEpfHx0aGlzfWZ1bmN0aW9uIGVjKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5sPTE1MDA7cmV0dXJuIGF9ZnVuY3Rpb24gZWIoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5YPSExO2EudT0hMTthLkQ9ITE7YS5zPSExO2EuYz0wO3JldHVybiBhfWZ1bmN0aW9uIHVhKGEpe2E9QS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5mPTA7YS5sPSExO3JldHVybiBhfWZ1bmN0aW9uIGZjKGEpe3JldHVybiBGLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBnYyhhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLmFiPW51bGw7cmV0dXJuIGF9ZnVuY3Rpb24gYWIoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmFiPW51bGw7YS5sPS0xO2EuZj1nLlRjO3JldHVybiBhfWZ1bmN0aW9uIGhjKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5sPS0xO3JldHVybiBhfWZ1bmN0aW9uIEFiKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gQWEoYSl7YT0KQS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5tPSExO2EuZj0hMTtyZXR1cm4gYX1mdW5jdGlvbiBCYihhKXthPUYuY2FsbCh0aGlzLGEpfHx0aGlzO2EubT0hMTtyZXR1cm4gYX1mdW5jdGlvbiBmYShhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLkZhPSExO2EuTT0hMTthLkRhPSExO2EudT0hMTthLks9ITE7YS5HYT1sLnMoMTApO2EuUz0hMDthLmRhPSExO2EuRz0hMTthLlg9ITE7YS5XYT0iIjthLkthPSExO2Eubz0hMTthLlA9ITE7YS5JYT0hMTthLmltYT0hMTtyZXR1cm4gYX1mdW5jdGlvbiBCYShhKXtyZXR1cm4gQS5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gQ2IoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGZiKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2Euc3RhdHVzPWEuRjthLmNhPSExO2EuSz0hMTthLm89ITE7YS5QPSExO2EuaXNQbGF5aW5nPSExO2EuRz0xO2EuTj0wO2Eucz1bXTthLmY9ITE7YS5NPVtdO2EuQT0wO2EudT0KMDthLk89ITE7YS5vbmNlPSExO2EuWj0hMTthLlM9W107YS5EPSExO3JldHVybiBhfWZ1bmN0aW9uIGxhKGEpe2E9QS5jYWxsKHRoaXMsYSl8fHRoaXM7dm9pZCAwPT1hLlRhJiYoYS5UYT0hMSk7dm9pZCAwPT1hLmYmJihhLmY9ITEpO3ZvaWQgMD09YS5sJiYoYS5sPSExKTt2b2lkIDA9PWEueWQmJihhLnlkPSExKTtyZXR1cm4gYX1mdW5jdGlvbiBpYyhhKXtyZXR1cm4gRi5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gTGIoYSxjKXtyZXR1cm4gRS5jYWxsKHRoaXMsYSxjKXx8dGhpc31mdW5jdGlvbiBsYihhKXthPUEuY2FsbCh0aGlzLGEpfHx0aGlzO2EuTGE9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gRShhLGMpe3RoaXMucGxheWVyPSIiO3RoaXMuVz1udWxsO3RoaXMuWT0iMSI7dGhpcy5pYT0iMiI7dGhpcy5rYT0iMyI7dGhpcy5GPTA7dGhpcy5tPVtdO3RoaXMubD1bXTt0aGlzLkI9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSwKdW5rbm93bjo2fTt0aGlzLmZhPSExO3RoaXMuc3RhdHVzPXRoaXMuRjt0aGlzLmlkPWwuZygxMCk7dGhpcy5nYShhKTt0aGlzLndhKGMpfWZ1bmN0aW9uIEEoYSl7dGhpcy5jPXRoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuaT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuaGM9IiI7dGhpcy5GPW51bGw7dGhpcy5WKCl9ZnVuY3Rpb24gRihhKXt0aGlzLmY9e307dGhpcy5hPW51bGw7dGhpcy5GPTA7dGhpcy5sPTE1MDt0aGlzLmxjPTA7dGhpcy5LKGEpfWZ1bmN0aW9uIG1iKCl7dGhpcy5nPXRoaXMuaT0hMTt0aGlzLmI9W107dGhpcy5jPXt9fWZ1bmN0aW9uIGlhKGEsYyl7dGhpcy5sPWN8fHt9O3RoaXMuVD1hO3RoaXMuVmE9YS54YSgpO3RoaXMuYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmEuaWQ9bC5nKDEwKTt0aGlzLmY9YmIucG9wKCk7dGhpcy5mfHwobC50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLmY9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5mLmlkPSJhZFhkaXNwbGF5Iix0aGlzLmYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLmI9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MCxwb3NpdGlvbjoiIn07dGhpcy5CPSExO3RoaXMuaT1bXTt0aGlzLm09ITF9ZnVuY3Rpb24gQyhhLGMpe3ZhciBkPUVycm9yLmNhbGwodGhpcyxhLnR5cGUpO3RoaXMubWVzc2FnZT1kLm1lc3NhZ2U7InN0YWNrImluIGQmJih0aGlzLnN0YWNrPWQuc3RhY2spO3RoaXMudHlwZT1hO3RoaXMuZGF0YT1jO3RoaXMuZGF0YXx8KHRoaXMuZGF0YT17fSk7dGhpcy5kYXRhLmRldGFpbHN8fCh0aGlzLmRhdGEuZGV0YWlscz1DLmEuUGQpO3RoaXMuZGV0YWlscz10aGlzLmRhdGEuZGV0YWlsc31mdW5jdGlvbiBqYShhLGMsZCxlKXt0aGlzLmM9ImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQgYXBwbGljYXRpb24vamF2YXNjcmlwdCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQgYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IHRleHQvZWNtYXNjcmlwdCB0ZXh0L2phdmFzY3JpcHQgdGV4dC9qc2NyaXB0IHRleHQveC1lY21hc2NyaXB0IHRleHQveC1qYXZhc2NyaXB0Ii5zcGxpdCgiICIpOwp0aGlzLmphPWE7dGhpcy5hPWM7dGhpcy5DPWU7dGhpcy50Yz0wO3RoaXMuZHVyYXRpb249dGhpcy5vKCk7dGhpcy5vYz10aGlzLmwoKTt0aGlzLlViPXRoaXMubSgpO3RoaXMuWGI9dGhpcy5GKCk7dGhpcy50ZD0hMTt0aGlzLmk9dGhpcy5nPSIiO3RoaXMuZXJyb3I9bnVsbDt0aGlzLkdkPVtdfWZ1bmN0aW9uIFcoYSxjKXthPXZvaWQgMD09PWE/IiI6YTtjPXZvaWQgMD09PWM/ITE6Yzt2YXIgZD12YS5jYWxsKHRoaXMpfHx0aGlzO2Quc3JjPWE7ZC5kYT1jO2QuYT1udWxsO2QuTWE9W107ZC5aPVtdO2QuYj1bXTtkLmk9W107ZC5XPSExO2QuWT0hMTtkLmM9ITE7ZC5sPSExO2QuRD0xO2Quc3JjLmxlbmd0aCYmZC5sb2FkKGQuc3JjKTtyZXR1cm4gZH1mdW5jdGlvbiBuYihhKXthPXZvaWQgMD09PWE/IiI6YTt2YXIgYz1JYS5jYWxsKHRoaXMsbnVsbCl8fHRoaXM7Yy5hPW51bGw7Yy5zcmM9YTtyZXR1cm4gY31mdW5jdGlvbiBJYShhLGMpe3RoaXMuQz1hO3RoaXMucG9zaXRpb249dm9pZCAwPT09CmM/InByZXJvbGwiOmM7dGhpcy5zPW51bGw7dGhpcy5qYT1bXTt0aGlzLmI9W107dGhpcy5nPVtdO3RoaXMuZHVyYXRpb249MH1mdW5jdGlvbiBUYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLmRhdGE9Yzt0aGlzLmphPVtdfWZ1bmN0aW9uIE5hKGEsYyl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5pZD1jKyJjb250YWluZXIiO2EuYXBwZW5kQ2hpbGQoZCk7YT1jYS5jYWxsKHRoaXMsZCxjKXx8dGhpczthLmNvbnRhaW5lcj1kO2EuamE9W107YS5sPVtdO2EuZj0tMTthLmZvcm1hdD0icG9ydHJhaXQiO2EuRCgpO3JldHVybiBhfWZ1bmN0aW9uIGNhKGEsYyxkKXt2YXIgZT12YS5jYWxsKHRoaXMpfHx0aGlzO2Uud2I9YTtlLmlkPWM7ZS5iPU9iamVjdC5hc3NpZ24oe30se3dpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUiLHByZWxvYWQ6ImF1dG8iLGF1dG9wbGF5OiIifSxkKTtlLmE9ZS5zKCk7ZS5hLnNldEF0dHJpYnV0ZSgicG9zdGVyIiwiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vdmVydGljYWxpenIvYmxhY2sucG5nIik7CmUuTz0iMDAwMCI7ZS5QPSIiO2UucGFyZW50PW51bGw7ZS5HKCk7ZS5LKCk7cmV0dXJuIGV9ZnVuY3Rpb24gUyhhKXt2YXIgYz12YS5jYWxsKHRoaXMpfHx0aGlzO2Mud2I9YTtjLmNvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmNvbnRhaW5lci5pZD0ibGltb3Jvb3QiO2MuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy5jb250YWluZXIuc3R5bGUudG9wPSIwIjtjLmNvbnRhaW5lci5zdHlsZS5sZWZ0PSIwIjtjLmNvbnRhaW5lci5zdHlsZS53aWR0aD0iMTAwJSI7Yy5jb250YWluZXIuc3R5bGUuaGVpZ2h0PSIxMDAlIjtjLmI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy51PW51bGw7Yy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpjLmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5hPW51bGw7Yy5tPW51bGw7Yy5mPW51bGw7Yy5sYWJlbD1udWxsO2Mucz1udWxsO2MuTj0tMTtjLnBsYXllcj1uZXcgTmEoYy5jb250YWluZXIsImxpbW9fdmlkZW8iKTtjLnBsYXllci5wYXJlbnQ9YztjLnBsYXllci5vbigiY29tcGxldGUiLGZ1bmN0aW9uKCl7Yy5iYSgpfSk7Yy5vbigidmlkZW9zdGFydCIsZnVuY3Rpb24oKXtjLksmJiFjLlMmJihnLmoudHJhY2soInZydGNsenJfcmV0dXJuZWQiLCIiLCEwKSxjLlM9ITApfSk7Yy5ZPSExO2MuQj1bXTtjLmk9W107Yy5XPTA7Yy5LPSExO2MuUz0hMTtjLkQ9ITE7Yy5sYSgpO3JldHVybiBjfWZ1bmN0aW9uIFIoYSl7dmFyIGM9UC5jYWxsKHRoaXMpfHx0aGlzO2cuai50cmFjaygidnJ0Y2x6cl9zZXR1cCIsIiIsITApO2MubT1hO2MucGFyZW50PW51bGw7Yy5CPSExO2Mucz1nLnYuYigidmVydGljYWxpenIiKXx8e307Yy5hPW5ldyBTO2MuYS5hPWM7Yy5yYz1jLnMuYWxpYXN8fAoic3ZtcHJldmlldyI7LTEhPT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCImcHJldmlldyIpJiYoYy5yYz0ic3ZtcHJldmlldyIpO2MuVT0oYy5zLmFwaXx8Imh0dHBzOi8vd3d3LndlbGVjdC5kZS9hcGkvdjEvY29uc3VtcHRpb25zL29mZmVyL2J5X2FsaWFzL1thbGlhc10vIikucmVwbGFjZSgiW2FsaWFzXSIsYy5yYykrIj9nZHByPVtnZHByXSZnZHByX2NvbnNlbnQ9W2dkcHJfY29uc2VudF0iO2MuYj1bXTtjLk89ITE7Yy5TKCk7Yy5tfHwoYy5QKCksYy51KCkpO3JldHVybiBjfWZ1bmN0aW9uIFYoKXt2YXIgYT1QLmNhbGwodGhpcyl8fHRoaXM7YS5aPSJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCI7YS5hPW51bGw7YS5iPSExO2EuZj0hMTthLm09ITE7YS5QPTA7YS5CPTA7YS5zPTA7YS5PPVtdO3JldHVybiBhfWZ1bmN0aW9uIE9hKCl7dmFyIGE9TC5jYWxsKHRoaXMpfHx0aGlzOwphLmE9bnVsbDtyZXR1cm4gYX1mdW5jdGlvbiBvYSgpe3ZhciBhPUwuY2FsbCh0aGlzKXx8dGhpczthLmE9bnVsbDthLndhKCk7YS5iYT0hMTthLmRhPSIiO3JldHVybiBhfWZ1bmN0aW9uIEwoKXt2YXIgYT1QLmNhbGwodGhpcyl8fHRoaXM7YS52aWRlb1RhZz1udWxsO2Eua2E9MUUzO2EuZj0hMTthLlM9ITE7YS51PSExO2EuUD0hMTthLlo9ITE7YS5PPSExO2EuQj0hMTtyZXR1cm4gYX1mdW5jdGlvbiBQKCl7dmFyIGE9dmEuY2FsbCh0aGlzKXx8dGhpczthLmV2ZW50PXtZYjoicmVhZHkiLFBhOiJlcnJvciIsT2E6ImVuZGVkIixwYzoidGltZXVwZGF0ZSIsR2M6ImltcHJlc3Npb24iLEtjOiJzdGFydCIsRmM6ImZpcnN0UXVhcnRpbGUiLEhjOiJtaWRwb2ludCIsTGM6InRoaXJkUXVhcnRpbGUiLEVjOiJjcmVhdGl2ZVZpZXciLHBkOiJza2lwIixxZDoidGltZWNoYW5nZSIsbWM6ImNsaWNrdGhyb3VnaCIsSWM6InBhdXNlIixvZDoicmVzdW1lIixOZDoibXV0ZSIsU2Q6InVubXV0ZSJ9OwphLkM9bnVsbDthLmM9bnVsbDthLmk9bnVsbDthLk49LTE7YS5EPW51bGw7cmV0dXJuIGF9ZnVuY3Rpb24gdShhLGMsZCl7dGhpcy5hPW51bGw7dGhpcy5qZChhKTthLlQuYWE/dGhpcy5iYT1hLlQuYWEoKTp0aGlzLmJhPSIiO2EuVC5DZCYmYS5ULkNkKHtwYXVzZTp0aGlzLmtjLmJpbmQodGhpcykscmVzdW1lOnRoaXMuTWIuYmluZCh0aGlzKSxtdXRlOnRoaXMuSWIuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5LZC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLlZhO3RoaXMucGxheWVyPXRoaXMuYS5UO3RoaXMuZj1udWxsO3RoaXMuaT1jO3RoaXMucz1udWxsO3RoaXMudmlkZW89e307dGhpcy5oYT17fTt0aGlzLllkPWcuai5nKDEwKTt0aGlzLmdhPTA7dGhpcy5aPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWj1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuVCkmJnRoaXMuYS5ULkNhJiYKKGE9dGhpcy5hLlQuQ2EoKSksdGhpcy5aPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlJjPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuVz0hMTt0aGlzLmw9bnVsbDt0aGlzLkM9e307dGhpcy5LYT0tMTt0aGlzLm09dGhpcy5WYj0hMTt0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5iZT1nLmouZygxMCk7dGhpcy56YT1nLmouZygxMCk7dGhpcy50YT1nLmouZygxMCk7dGhpcy5QYj1nLmouZygxMCk7dGhpcy5nPXt9O3RoaXMuSmI9dGhpcy5wYT10aGlzLlA9ITE7Zy5qLmcoMTApO3RoaXMuRmE9dGhpcy5pYT10aGlzLk09dGhpcy5sYT0hMTt0aGlzLlk9W107dGhpcy5OPXt9O3RoaXMua2E9dGhpcy5HYT0hMTt0aGlzLkE9bnVsbDt0aGlzLmM9dGhpcy5VPSExO3RoaXMuQj1udWxsO3RoaXMud2E9e307dGhpcy5EYT17fTt0aGlzLmliPSExO3RoaXMuZGlzcGxheT1udWxsfWZ1bmN0aW9uIG9iKCl7dGhpcy5pPQp0aGlzLmVjPSIiO3RoaXMuYjt0aGlzLmE9e319ZnVuY3Rpb24gQ2EoKXt9ZnVuY3Rpb24gdmEoKXt0aGlzLkY9bmV3IE1hcDt0aGlzLm89bmV3IE1hcDt0aGlzLk09bmV3IE1hcH1mdW5jdGlvbiBkYShhKXt0aGlzLmE9dGhpcy5wYXJzZShhKTt0aGlzLmY9IiJ9ZnVuY3Rpb24gdihhKXt0aGlzLmRhdGE9YXx8e307dGhpcy50eXBlPXRoaXMuZXJyb3JNZXNzYWdlPSIifWZ1bmN0aW9uIHooKXt0aGlzLkZkPSExO3RoaXMuVT0ic2V0dXAiO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlFiLmJpbmQodGhpcykpO3RoaXMub2E9dGhpcy5uYT1udWxsO3RoaXMudT10aGlzLmZhPSExO3RoaXMuTz1bXTt0aGlzLmhiPSExO3RoaXMuaT17fTt0aGlzLmdhKCk7dGhpcy5iYT0hMTt0aGlzLks9bnVsbDt0aGlzLmw9bmV3IE1hcDt0aGlzLnliKCl9ZnVuY3Rpb24gSCgpe2cuSD10aGlzO3dhPXRoaXM7dGhpcy5KYT0hMTt0aGlzLlFhPSIiO3RoaXMubmE9dGhpcy5VPXRoaXMuQT0KbnVsbDt0aGlzLk9iPXRoaXMuYmE9dGhpcy5BYj0hMTt0aGlzLmY9IiI7dGhpcy56Yj0hMTt0aGlzLkJhPXRoaXMuZmM9IiI7dGhpcy55Yj10aGlzLmI9dGhpcy5hPXRoaXMuZWQ9ITE7dGhpcy5nPVtdO3RoaXMuamI9dGhpcy5EPSIiO3RoaXMuZmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5XYT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5IYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5LPSIiO3RoaXMuTj1bXTt0aGlzLk89W107dGhpcy5nYT1bXTt0aGlzLlo9IiI7dGhpcy5TPSExO3RoaXMuR2E9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5jYT0hMTt0aGlzLk5iPXRoaXMuaGE9bnVsbDt0aGlzLmxiPXRoaXMuaWE9dGhpcy5pYj10aGlzLkthPXRoaXMucGI9dGhpcy5xYT10aGlzLkc9ITE7CnRoaXMuQj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xYj0iIjt0aGlzLmVhPTA7dGhpcy5kYT10aGlzLnhiPSExO3RoaXMuYml0cmF0ZT0xRTM7dGhpcy5rYT10aGlzLmxhPSIiO3RoaXMua2I9bnVsbDt0aGlzLkhkPSExO3RoaXMuTT10aGlzLlk9bnVsbDt0aGlzLmk9e307dGhpcy5EYT0wO3RoaXMuQmI9dGhpcy5vPSExO3RoaXMuVz0xMDt0aGlzLnRiPWZ1bmN0aW9uKCl7fTt0aGlzLnphPS0xO3RoaXMuaGI9dGhpcy5vYT0hMTt0aGlzLnBhPXt9fWZ1bmN0aW9uIHBiKCl7dGhpcy5hPXRoaXMuYj0hMX1mdW5jdGlvbiBnYihhLGMsZCxlLGYpe3RoaXMuYT1hO3RoaXMuZj10aGlzLkY9ITE7dGhpcy5tPWQ7dGhpcy5jPSExO3RoaXMudGltZW91dD0wO3RoaXMubz0hMTt0aGlzLmc9LTE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuYT1uZXcgUGEoYSkpO3ZhciBoPXRoaXMuYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshY3x8CjQhPWgucmVhZHlTdGF0ZXx8MjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1c3x8KHRoaXMuaSgpLHRoaXMubChoKSxnLnYuYigiY29tcGFuaW9ucyIpJiYoaD10aGlzLkIoaCkpLGMoaCkpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz8odGhpcy5pKCksdGhpcy5sKGgpLGQoaCkpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmcuai5CKHRoaXMuYS51cmwpJiYhZiYmbC50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCk7ZSYmNCE9aC5yZWFkeVN0YXRlJiZlKGgpfS5iaW5kKHRoaXMpfWZ1bmN0aW9uIFBhKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWZ1bmN0aW9uIHFiKCl7dGhpcy5hPXt9O3RoaXMuYz17fTt0aGlzLmNsaWVudD17fTt0aGlzLmk9e319ZnVuY3Rpb24gaGIoKXt9ZnVuY3Rpb24gSmEoKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsCkphKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixKYSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsSmEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsSmEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixKYSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixKYSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsSmEpO3NjPSEwO2Zvcih2YXIgYT0wO2E8YmIubGVuZ3RoO2ErKyliYlthXS5sb2FkKCk7Zm9yKGE9MDthPGJiLmxlbmd0aDthKyspe3ZhciBjPWJiW2FdLnBsYXkoKTtpZih2b2lkIDAhPT1jKWMudGhlbihmdW5jdGlvbigpe30pWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSl9TWImJihNYigpLE1iPSExKX1mdW5jdGlvbiB0Yygpe3ZhciBhPXdpbmRvdy5PTzthfHwoYT13aW5kb3cuak9PUGxheWVyXzApO3JldHVybiBhfWZ1bmN0aW9uIHVjKCl7dHJ5e2wuRyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChmKXt9aWYoZy52Lmcpe3ZhciBhPQpJYyhmdW5jdGlvbigpe2wuaGEod2luZG93LE5iLmMoKSx7aWQ6YX0pfSw1MDApO2lmKGwuaGIpd2EuWGQoKTtlbHNle2cudi5hLnBhdXNlQnV0dG9ufHwoZy52LmEucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpnLnYuYS5wbGF5QnV0dG9ufHwoZy52LmEucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmcudi5hLm11dGVCdXR0b258fChnLnYuYS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKZy52LmEudW5tdXRlQnV0dG9ufHwoZy52LmEudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKZy52LmEuc2tpcGFibGVCdXR0b258fChnLnYuYS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2cudi5hLnNraXBCdXR0b258fChnLnYuYS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CndhLlNhfHxuZXcgSDtpZihnLnYuYigiYnlwYXNzIikpe3ZhciBjPWcudi5iKCJjbGllbnRDb25maWciKTtpZigib2JqZWN0Ij09PXR5cGVvZiBjKXt2YXIgZD1jLmFsaWFzO3ZhciBlPWMuc2VydmVyfWQmJmU/KGcuSC5kYT0hMCxnLkguVihkLGUpLGcuSC5GYigpKTpnLkguU2EoZy52LmEuZ2xvYmFsQ29uZmlnLGcudi5hLmNsaWVudENvbmZpZyxnLnYuYS5wcmVjaGVja2VkLGcudi5hLm9uUmVhZHksZy52LmEub25GYWlsdXJlLGcudi5hKX1lbHNlIGcuSC5TYShnLnYuYS5nbG9iYWxDb25maWcsZy52LmEuY2xpZW50Q29uZmlnLGcudi5hLnByZWNoZWNrZWQsZy52LmEub25SZWFkeSxnLnYuYS5vbkZhaWx1cmUsZy52LmEpO2RvY3VtZW50LmhkX3JlYWR5PSEwfX1lbHNlIEpjKHVjLDUwKX1mdW5jdGlvbiBYKGEsYyl7aWYoZy52LmcmJndhLlNhKXsoZy52LmEuYWRUYWd8fGcudi5hLnByZXJvbGxBZFRhZykmJmEucGF1c2UoKTtsLmEodi5iLGEuQ2EoKSk7aWYoYS5nZXRDdXJyZW50VGltZSl7dmFyIGQ9CmEuZ2V0Q3VycmVudFRpbWUoKTtkJiZsLnRyYWNrKCJhY3RpdmF0ZWRBdCIsZCl9Yz93YS5KYT0hMDpsLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTtkPW5ldyBrO2QuQihhKTtkLkcod2EpO2QuRihnLnYuYSk7ZC53KCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe1goYSxjKX0uYmluZCh0aGlzKSw1MCl9cWIucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSl7cmV0dXJuIDA8T2JqZWN0LmtleXMoYXx8e30pLmxlbmd0aCYmYS5jb25zdHJ1Y3Rvcj09PU9iamVjdH07cWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaVthXXx8dGhpcy5jbGllbnRbYV18fHRoaXMuYVthXX07cWIucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm57ZW1iZWQ6dGhpcy5hLGdsb2JhbDp0aGlzLmMsY2xpZW50OnRoaXMuY2xpZW50LGN1c3RvbWVyOnRoaXMuaX19O1FhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHFiLnByb3RvdHlwZSx7Zzp7Y29uZmlndXJhYmxlOiEwLAplbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmwodGhpcy5hKX19fSk7dmFyIGc9e3Y6bnVsbCxIOm51bGwsajpudWxsfTtnLnY9bmV3IHFiO1BhLnByb3RvdHlwZS5hPWZ1bmN0aW9uKGEpe3RoaXMuZGF0YS5ob21hZF9tYWNyb3M9YX07UGEucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYShKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYyl7fX07Z2IucHJvdG90eXBlLkI9ZnVuY3Rpb24oYSl7aWYoYSYmYS5yZXNwb25zZVRleHQmJmEucmVzcG9uc2VUZXh0LmluZGV4T2YmJjA8PWEucmVzcG9uc2VUZXh0LmluZGV4T2YoIklGcmFtZVJlc291cmNlIikpdHJ5e3ZhciBjPXt9O2MucmVzcG9uc2VUZXh0PWEucmVzcG9uc2VUZXh0O2Zvcih2YXIgZD0obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGMucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDb21wYW5pb25BZHMiKSxlPTA7ZTxkLmxlbmd0aDtlKyspZm9yKHZhciBmPQpkW2VdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJRnJhbWVSZXNvdXJjZSIpLGg9MDtoPGYubGVuZ3RoO2grKyl7dmFyIG09Zy5qLkJkKGZbaF0pLEQ9Zy5qLk4obSxnLkgsITApO2cuai5jKG0pO2MucmVzcG9uc2VUZXh0PWMucmVzcG9uc2VUZXh0LnJlcGxhY2UobSxEKTtjLnJlc3BvbnNlWE1MPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYy5yZXNwb25zZVRleHQsInRleHQveG1sIil9Zy5qLnRyYWNrKCJzdGF0c19oZF9jb21wYW5pb24iLCIiLCEwKTtyZXR1cm4gY31jYXRjaChNKXt9cmV0dXJuIGF9O2diLnByb3RvdHlwZS5sPWZ1bmN0aW9uKGEpe3ZhciBjPSExO2lmKGEmJiEoYS5yZXNwb25zZSYmYS5yZXNwb25zZS5pbmRleE9mJiYwPD1hLnJlc3BvbnNlLmluZGV4T2YoInN0YXRzX2hkX2FsaXZlIikpKXRyeXt2YXIgZD1hLmdldEFsbFJlc3BvbnNlSGVhZGVycygpO2lmKDA8PWQuaW5kZXhPZigiZGF0ZToiKXx8MDw9ZC5pbmRleE9mKCJEYXRlOiIpKWM9YS5nZXRSZXNwb25zZUhlYWRlcigiRGF0ZSIpOwppZihjKXt2YXIgZT1uZXcgRGF0ZShjKTtnLkgub2F8fChnLkgub2E9ZS5nZXRUaW1lKCkpO2cuSC5oYj1lLmdldFRpbWUoKTt2YXIgZj1nLkguaGItZy5ILm9hO2lmKGYpe3ZhciBoPU1hdGguZmxvb3IoZi82RTQpLG09TWF0aC5mbG9vcihmLzM2RTUpLEQ9TWF0aC5mbG9vcihmLzg2NEU1KTthPSIiOzU8PWgmJihhPSI1bWluIik7MTA8PWgmJihhPSIxMG1pbiIpOzIwPD1oJiYoYT0iMjBtaW4iKTszMDw9aCYmKGE9IjMwbWluIik7NDU8PWgmJihhPSI0NW1pbiIpOzE8PW0mJihhPW0rImgiKTsxPD1EJiYoYT1EKyJkIik7YSYmZy5ILnBhJiYhZy5ILnBhW2FdJiYoZy5ILnBhW2FdPSEwLGcuai50cmFjaygic3RhdHNfaGRfYWxpdmUiLGEsITApKX19fWNhdGNoKE0pe319O2diLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dGhpcy50aW1lb3V0JiYodGhpcy5nPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLHRoaXMudGltZW91dCkpfTtnYi5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3RoaXMuZyYmCndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nKTt0aGlzLmc9ITF9O2diLnByb3RvdHlwZS5zPWZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5vPSEwO3RoaXMuYi5vPSEwO3RoaXMuYi5hYm9ydCgpfTtnYi5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGM9YTthPSIiO2Zvcih2YXIgZCBpbiBjKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoY1tkXSk7YT1hLnN1YnN0cigxKX10aGlzLmYmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuYi51cmxDYWxsZWQ9dGhpcy5hLnVybDt0cnl7dGhpcy5jP3RoaXMuYi5vcGVuKHRoaXMuYS5tZXRob2QsdGhpcy5hLnVybCwhMSk6dGhpcy5iLm9wZW4odGhpcy5hLm1ldGhvZCx0aGlzLmEudXJsLCEwKSx0aGlzLkZ8fCh0aGlzLmIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLmIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLGEmJjA8YS5sZW5ndGgmJmEuaW5kZXhPZiYmKDA8YS5pbmRleE9mKCJob21hZF90cmFja19rZXkiKXx8MDxhLmluZGV4T2YoImhvbWFkX2F0IikpJiYoYSs9IiZob21hZF92ZXJzaW9uPTIwMjEwMTI2XzEwNDkiKSx0aGlzLmIuc2VuZChhKSx0aGlzLnUoKX1jYXRjaChlKXthPXRoaXMuYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8dGhpcy5hLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksZy5qLkIodGhpcy5hLnVybCkmJiFhJiZsLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsImNhdGNoIiwhMCksdGhpcy5tJiZ0aGlzLm0oKX1yZXR1cm4gdGhpcy5ifTtwYi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXt0aGlzLmI9YX07cGIucHJvdG90eXBlLmM9CmZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtwYi5wcm90b3R5cGUuaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoZSxmKXtlLmFkZEV2ZW50TGlzdGVuZXIoZixmdW5jdGlvbigpe30pfXZhciBjPXtVZToiQWRDbGlja1RocnUiLFdlOiJBZEVycm9yIixYZToiQWRTdG9wcGVkIiwkZToiQWRMaW5lYXJDaGFuZ2UiLGFmOiJBZFRhZ1BhcnNlZCIsZGY6IkFkVmlkZW9Db21wbGV0ZSIsZ2Y6IkFkTG9hZGVkIixoZjoiQWRTa2lwcGVkIixqZjoiQWRTdGFydGVkIixZZToiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLFplOiJBZEltcHJlc3Npb24iLFZlOiJBZENyZWF0aXZlVmlldyIsYmY6IkFkVmlkZW9NaWRwb2ludCIsY2Y6IkFkUGF1c2VkIixlZjoiQWRWaWRlb1N0YXJ0IixmZjoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGM9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGMpYy5oYXNPd25Qcm9wZXJ0eShkKSYmCmEodGhpcy5iLGNbZF0se30pfTtwYi5wcm90b3R5cGUuZz1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoZCxlKXtkLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpe30pfWlmKHRoaXMuYSYmdGhpcy5hLkpjKWZvcih2YXIgYyBpbiB0aGlzLmEuSmMpdGhpcy5hLkpjLmhhc093blByb3BlcnR5KGMpJiZhKHRoaXMuYSx0aGlzLmEuSmNbY10se30pO3RoaXMuYSYmdGhpcy5hLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt9LmJpbmQodGhpcyksMTApfTtwYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMuYiYmdGhpcy5pKCk7dGhpcy5hJiZ0aGlzLmcoKX07SC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5RYSxhZHRhZ21vZGlmaWVyOnRoaXMuQSxhZHRhZ21vZGlmaWVyQWR2OnRoaXMuVSxhZHRhZ3JlZ2V4OnRoaXMubmEsYml0cmF0ZTp0aGlzLmJpdHJhdGUsanNwb3B1cHM6dGhpcy5BYiwKc2lkZWxvYWRzOnRoaXMuYmEsZGlzYWJsZXRlc3RzOnRoaXMuT2IsaG9tYWRBbGlhczp0aGlzLmYsaXNJbml0aWFsaXplZDp0aGlzLnpiLGdsb2JhbENvbmZpZzp0aGlzLmZjLGNsaWVudENvbmZpZzp0aGlzLkJhLGlzRW5hYmxlZDp0aGlzLmEsaXNWZXJpZmllZDp0aGlzLmIsaXNCbG9ja2VkOnRoaXMueWIsc2VydmVyOnRoaXMuZyxzdm1Db25maWc6dGhpcy5ELGhvbWFkQWRwYXRoOnRoaXMuamIsSE9NQURfVkVSSUZJRUQ6dGhpcy5mYixIT01BRF9CTE9DS0VEOnRoaXMuV2EsSE9NQURfTk9CTE9DS0VSOnRoaXMudSxIT01BRF9BREJMT0NLRVI6dGhpcy5IYix0ZXN0SGlkZTp0aGlzLkssdGVzdFRhZ3M6dGhpcy5OLHRlc3RUYWdzSlM6dGhpcy5PLHRlc3RUYWdzWEhSOnRoaXMuZ2EsdGVzdDNQQ29va2llOnRoaXMuWix0aHJvdHRsZTp0aGlzLkdhLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuY2EsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5OYiwKYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5HLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5xYSx1c2VTdHJpY3RDaGVja3M6dGhpcy5wYix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5LYSxjb25maWdGYWlsdXJlczp0aGlzLkIsc2l0ZUNvbmZpZzp0aGlzLmksc2VydmVySWQ6dGhpcy5EYSxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMubyx2cGFpZDp0aGlzLmlhLHNraXBBbGxvd2VkOnRoaXMubGIsdm1hcHM6dGhpcy5xYixhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuZGEsYWRGYWxsYmFja1VSTDp0aGlzLmxhLGFkRmFsbGJhY2tDb25maWc6dGhpcy5rYSx5aWVsZGxhYjp0aGlzLmtiLF9jb25maWc6Zy52LmYoKX19O0gucHJvdG90eXBlLlNiPWZ1bmN0aW9uKCl7dmFyIGE9ITEsYztmb3IoYyBpbiB0aGlzLkIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5CW2NdJiYxPT10aGlzLkJbY10mJihhPSEwKTtyZXR1cm4gYX07SC5wcm90b3R5cGUuaGQ9ZnVuY3Rpb24oYSl7dGhpcy5CW2FdPQohMH07SC5wcm90b3R5cGUuUWI9ZnVuY3Rpb24oKXt2YXIgYT1bXSxjO2ZvcihjIGluIHRoaXMuQikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLkJbY10mJjE9PXRoaXMuQltjXSYmYS5wdXNoKGMpO3JldHVybiBhfTtILnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9dm9pZCAwPT09ZD8hMTpkO2lmKCEodGhpcy5KYXx8dm9pZCAwIT09YyYmYykpcmV0dXJuIG5ldyBQYShhKTtjPWcuai5CKGEpO3ZhciBlPWwuYyhhKTtpZihjKXt2YXIgZj10aGlzLndhKCk/YTplLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIjthPWUucGF0aC5zdWJzdHIoMSl9ZWxzZSBmPXRoaXMucygpLGE9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIik7ZCYmKHRoaXMuUWF8fHRoaXMuQXx8dGhpcy5VfHx0aGlzLm5hfHxnLnYuYigidGNmX2NvbmZpZyIpKSYmKGE9dGhpcy5DYihhKSk7ZD1uZXcgUGEoZik7ZC51cmw9ZjtjPWM/ZS5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOgp0aGlzLnRhKGUuaG9zdCk7ZC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YztkLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1hO2QuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND1sLkEoYSk7ZC5tZXRob2Q9IlBPU1QiO3JldHVybiBkfTtILnByb3RvdHlwZS53YT1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuZyYmdGhpcy5nLmxlbmd0aCYmMDx0aGlzLmcubGVuZ3RoJiYoYT10aGlzLmdbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxhPShhPWEuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX07SC5wcm90b3R5cGUudGE9ZnVuY3Rpb24oYSl7dmFyIGM9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5mJiYwPHRoaXMuZi5sZW5ndGgpcmV0dXJuIHRoaXMuZjtmb3IoYyBpbiB0aGlzLmYpe3ZhciBkPXRoaXMuZltjXTtpZihkLmhhc093blByb3BlcnR5KCJ1cmwiKSYmCmQudXJsPT09YSlyZXR1cm4gZC5hbGlhc31yZXR1cm4ibm9uZSJ9O0gucHJvdG90eXBlLmZhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ1t0aGlzLkRhXX07SC5wcm90b3R5cGUucz1mdW5jdGlvbigpe3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiLGM9dGhpcy5mYSgpO2E9bC5pYihhKTt2YXIgZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGMucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfTtILnByb3RvdHlwZS5EYj1mdW5jdGlvbihhKXt2YXIgYz0hMSxkPSIiO2lmKGEuZXZhbCl0cnl7ZD1ldmFsKCIoIithLmV2YWwrIikoKSIpfWNhdGNoKGUpe2M9ITB9ZWxzZSBjPSEwO2MmJiJLRUVQIiE9PWEuZmFsbGJhY2smJihkPWEuZmFsbGJhY2spO3JldHVybiBkfTtILnByb3RvdHlwZS4kYj1mdW5jdGlvbihhLGMpe2E9bC5jKGEpO3ZhciBkO2ZvcihkIGluIGMpe2lmKGNbZF0uc3VidmFsdWVzKXt2YXIgZT0KZGVjb2RlVVJJQ29tcG9uZW50KGEucXVlcnlLZXlbZF0pLnNwbGl0KCImIik7dmFyIGY9e307Zm9yKHZhciBoPTA7aDxlLmxlbmd0aDtoKyspe3ZhciBtPWVbaF0uc3BsaXQoIj0iKTtmW21bMF1dPW1bMV19Zm9yKHZhciBEIGluIGNbZF0uc3VidmFsdWVzKWZbRF09dGhpcy5EYihjW2RdLnN1YnZhbHVlc1tEXSk7ZT1bXTtmb3IoRCBpbiBmKWUucHVzaChEKyI9IitmW0RdKTtmPWU9ZW5jb2RlVVJJQ29tcG9uZW50KGUuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5EYihjW2RdKTthLnF1ZXJ5S2V5W2RdPWZ9Yz1bXTtmb3IoZCBpbiBhLnF1ZXJ5S2V5KWMucHVzaChkKyI9IithLnF1ZXJ5S2V5W2RdKTtyZXR1cm4gYS5ob3N0K2EucGF0aCsiPyIrYy5qb2luKCImIil9O0gucHJvdG90eXBlLkNiPWZ1bmN0aW9uKGEpe3RoaXMuUWEmJihhKz10aGlzLlFhKTtpZih0aGlzLkEpZm9yKHZhciBjIGluIHRoaXMuQSl0aGlzLkEuaGFzT3duUHJvcGVydHkoYykmJihhPWEucmVwbGFjZShjLHRoaXMuQVtjXSkpOwppZihsLk8pZm9yKHZhciBkPTA7ZDxsLk8ubGVuZ3RoO2QrKyl7dmFyIGU9bC5PW2RdO2ZvcihjIGluIGUpYT1hLnJlcGxhY2UoYyxlW2NdKX10aGlzLlUmJihhPXRoaXMuJGIoYSx0aGlzLlUpKTtpZihkPWcudi5iKCJ0Y2ZfY29uZmlnIikpYz1kLmNvbnNlbnRfc3RyaW5nX3BsYWNlaG9sZGVyfHwiW2dkcHJfY29uc2VudF0iLGQ9ZC5nZHByX2FwcGxpZXNfcGxhY2Vob2xkZXJ8fCJbZ2Rwcl0iLGcuVWEmJihhPWEucmVwbGFjZShjLGcuVWEuZWN8fCJ1bmRlZmluZWQiKSxhPWEucmVwbGFjZShkLGcuVWEuV2M/InRydWUiOiJmYWxzZSIpKTtyZXR1cm4gYX07SC5wcm90b3R5cGUubWE9ZnVuY3Rpb24oYSl7Zy52LmIoImdkcHIiKSYmKGE9bmV3IGRhKGEpLCghYS5iKCJnZHByIil8fGEuYigiZ2RwciIpJiYwPT09YS5nKCJnZHByIikubGVuZ3RoKSYmYS5pKCJnZHByIiwiW2dkcHJdIiksYS5iKCJjb25zZW50Iil8fGEuYigiZ2Rwcl9jb25zZW50Iil8fGEubCgpLGEuYigiY29uc2VudCIpJiYKMD09PWEuZygiY29uc2VudCIpLmxlbmd0aCYmYS5pKCJjb25zZW50IiwiW2dkcHJfY29uc2VudF0iKSxhLmIoImdkcHJfY29uc2VudCIpJiYwPT09YS5nKCJnZHByX2NvbnNlbnQiKS5sZW5ndGgmJmEuaSgiZ2Rwcl9jb25zZW50IiwiW2dkcHJfY29uc2VudF0iKSxhPWEudG9TdHJpbmcoKSk7dmFyIGM9Zy52LmIoInRjZl9jb25maWciKTtpZihjKXt2YXIgZD1jLmNvbnNlbnRfc3RyaW5nX3BsYWNlaG9sZGVyfHwiW2dkcHJfY29uc2VudF0iO2M9Yy5nZHByX2FwcGxpZXNfcGxhY2Vob2xkZXJ8fCJbZ2Rwcl0iO2cuVWEmJihhPWEucmVwbGFjZShkLGcuVWEuZWN8fCJ1bmRlZmluZWQiKSxhPWEucmVwbGFjZShjLGcuVWEuV2M/IjEiOiIwIikpfWVsc2UgYT1hLnJlcGxhY2UoIltnZHByX2NvbnNlbnRdIixnLlVhLmVjfHwidW5kZWZpbmVkIiksYT1hLnJlcGxhY2UoIltnZHByXSIsZy5VYS5XYz8iMSI6IjAiKTtyZXR1cm4gYX07SC5wcm90b3R5cGUuTWI9ZnVuY3Rpb24oKXt0aGlzLmkmJgp0aGlzLmkuY2xpZW50QVBJcyYmdGhpcy5JYih0aGlzLmkuY2xpZW50QVBJcyl9O0gucHJvdG90eXBlLkliPWZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPW5ldyBwYjthLnB1Ymxpc2hlckFQSSYmYy5mKGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYy5jKGEucGxheWVyKTtjLncoKX19O0gucHJvdG90eXBlLlY9ZnVuY3Rpb24oYSxjKXt0aGlzLmY9YTt0aGlzLmc9Yzt0aGlzLmE9ITB9O0gucHJvdG90eXBlLlNhPWZ1bmN0aW9uKGEsYyxkLGUsZixoKXt3YT10aGlzO3RoaXMuemI9ITA7dGhpcy5mYz1hO3RoaXMuQmE9Yzt0aGlzLmVkPWQ7dGhpcy5oYT1lO3RoaXMudGI9Zjt0aGlzLmk9aHx8e307dGhpcy5NYigpO3RoaXMuWmIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5UYigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy5CYSl0cnl7dGhpcy5CYT1jKCksdGhpcy5kYygpfWNhdGNoKG0pe3RoaXMuQWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLkJhKXRyeXt0aGlzLkJhPWMsdGhpcy5kYygpfWNhdGNoKG0pe3RoaXMuQWEoIm5vQ2xpZW50Q29uZmlnIil9fTtILnByb3RvdHlwZS5tPWZ1bmN0aW9uKGEpe3ZhciBjPW51bGw7dHJ5e2M9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2M9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYy5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBjfTtILnByb3RvdHlwZS5YZD1mdW5jdGlvbigpe3RoaXMuYT0hMTt0aGlzLmI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm0odGhpcy51KSk7dGhpcy5GKCl9O0gucHJvdG90eXBlLkZiPWZ1bmN0aW9uKCl7dGhpcy5iPXRoaXMuSmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm0odGhpcy5IYikpO3RoaXMuRigpfTtILnByb3RvdHlwZS5aYj1mdW5jdGlvbigpe3RoaXMubChuZXcgUGEodGhpcy5mYyt0aGlzLlAoImdsb2JhbCIpKSx0aGlzLlJiLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhkKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRjKCl9LmJpbmQodGhpcyksITApfTtILnByb3RvdHlwZS5UYj1mdW5jdGlvbigpe3RoaXMubChuZXcgUGEodGhpcy5CYSt0aGlzLlAoImNsaWVudCIsLTEhPXRoaXMuQmEuaW5kZXhPZigiPyIpKSksdGhpcy5kYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5oZCgiY2xpZW50Iik7dGhpcy5BYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX07SC5wcm90b3R5cGUuUD1mdW5jdGlvbihhLGMpe2M9KCh2b2lkIDA9PT1jPzA6Yyk/IiYiOiI/IikrKCJjYWNoZT0iK2wucygpKTt0aGlzLmkmJnRoaXMuaS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGM9IiIpO3RoaXMuaSYmdGhpcy5pLm5vQ2FjaGVCdXN0ZXImJihjPSIiKTtyZXR1cm4gY307SC5wcm90b3R5cGUuQWE9ZnVuY3Rpb24oYSl7aWYoIXRoaXMucWEpe3RoaXMucWE9ITA7dmFyIGM9ZnVuY3Rpb24oZSl7ZXx8CihlPXdpbmRvdyk7Zm9yKHZhciBmPWUuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksaD0wO2g8Zi5sZW5ndGg7aCsrKXtpZihmW2hdJiZmW2hdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgZltoXS5wYXVzZSl0cnl7ZltoXS5wYXVzZSgpfWNhdGNoKG0pe31mW2hdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZltoXSl9Zj1lLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoaD0wO2g8Zi5sZW5ndGg7aCsrKWZbaF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmW2hdKTtmPWUuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihoPTA7aDxmLmxlbmd0aDtoKyspZltoXSYmZltoXS5wYXJlbnROb2RlJiZmW2hdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZltoXSk7Zj1lLmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGg9MDtoPGYubGVuZ3RoO2grKylmW2hdJiYKZltoXS5wYXJlbnROb2RlJiZmW2hdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZltoXSk7aWYoZS5zZWxmIT1lLnRvcClmb3IoZT1lLmRvY3VtZW50O2UuaGFzQ2hpbGROb2RlcygpOyllLnJlbW92ZUNoaWxkKGUubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09bC5HKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy50Yj1mdW5jdGlvbigpe30pOyJmb2N1cy5kZSI9PWwuRyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMudGI9ZnVuY3Rpb24oKXt9KTtpZih0aGlzLnRiJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMudGIpdGhpcy50YigpO2Vsc2V7YygpO3dpbmRvdy5zZXRJbnRlcnZhbChjLDUwMCk7dHJ5e2Mod2luZG93LnRvcCksd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7Yyh3aW5kb3cudG9wKX0sNTAwKX1jYXRjaChlKXt9fXRoaXMuYj10aGlzLnliPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMuV2EpKTt0aGlzLkYoKTtsLlAodi5jYSk7CnZhciBkPWwuRyh0aGlzLmZhKCkpO2R8fChkPWwuRyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2wudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX07SC5wcm90b3R5cGUuUmI9ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYil7dmFyIGM9e307dHJ5e2M9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZil7Yy5lbmFibGVkPSJmYWxzZSJ9dmFyIGQ9ITE7dHJ5e3ZhciBlPWwuYyh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtlJiZlLmluZGV4T2YmJjA8PWUuaW5kZXhPZigidHZub3ciKSYmKGQ9ITApfWNhdGNoKGYpe31pZighKGR8fGMuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmYy5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2M9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYS5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe31nLnYuYz1jO3RoaXMuYT1sLm0oYy5lbmFibGVkKTt0aGlzLmI9CiF0aGlzLmE7dGhpcy5hPyJvYmplY3QiIT10eXBlb2YgdGhpcy5CYXx8dGhpcy5EfHx0aGlzLmZ8fHRoaXMuZGMoKToodGhpcy5KYT10aGlzLmE9ITEsdGhpcy5iPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMudSkpLHRoaXMuRigpKX19O0gucHJvdG90eXBlLmRjPWZ1bmN0aW9uKGEpe3ZhciBjPSExO2EmJihjPWEucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihjKXRyeXtkPUpTT04ucGFyc2UoYy50b1N0cmluZygpKX1jYXRjaChmKXtkPXRoaXMuQmF9ZWxzZSBkPXRoaXMuQmE7Yz0hMTt0cnl7dmFyIGU9bC5jKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2UmJmUuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCJ0dm5vdyIpJiYoYz0hMCl9Y2F0Y2goZil7fWU9ZnVuY3Rpb24oKXtmb3IodmFyIGY9MDtmPGQuc2VydmVyLmxlbmd0aDtmKyspe3ZhciBoPWQuc2VydmVyW2ZdO3RyeXtpZih2b2lkIDA9PT1ofHwhaC5yZXBsYWNlKCJbaGFzaF0iLGwuaWIoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKC9eKGh0dHBzPyk6XC9cLyhbdy4tXSopOj8uKihbMC05XSspP1wvKFthLWYwLTldezQwfSlcLz8kL2cpKXJldHVybiExfWNhdGNoKG0pe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTsKaWYoIShjfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZlKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fWcudi5jbGllbnQ9ZDt0aGlzLmE9bC5tKGQuZW5hYmxlZCk7dGhpcy5iPSF0aGlzLmE7dGhpcy5nPWQuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5nLmxlbmd0aDthKyspdGhpcy5nW2FdPXRoaXMuZ1thXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGwuYigid2ViLmRlIil8fGwuYigiZ214Lm5ldCIpfHxsLmIoImdteC5hdCIpfHxsLmIoImdteC5jaCIpfHxsLmIoIjF1bmQxLmRlIikpJiYhdGhpcy53YSgpKWZvcihhPTA7YTx0aGlzLmcubGVuZ3RoO2ErKyl0aGlzLmdbYV09CnRoaXMuZ1thXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLkViKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rYT1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5EPWQuY29uZmlnfHwiIjt0aGlzLmY9ZC5hbGlhc3x8bnVsbDt0aGlzLmpiPWQuYWRwYXRofHwiIjt0aGlzLkRhPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmcubGVuZ3RoKTt0aGlzLmEmJnRoaXMuRCYmdGhpcy5mJiZ0aGlzLmcubGVuZ3RoP3RoaXMuamMoITEpOih0aGlzLkphPXRoaXMuYT0hMSx0aGlzLmI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm0odGhpcy51KSksdGhpcy5GKCkpfTtILnByb3RvdHlwZS5FYj1mdW5jdGlvbihhKXt0aGlzLmxhfHwodGhpcy5sYT1hfHwiIil9O0gucHJvdG90eXBlLmpjPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLmIpe3ZhciBjPXt9O2lmKGEpe2M9bmV3IFBhKHRoaXMucygpKTt2YXIgZD1sLmModGhpcy5EKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KInMzaG9tYWRnbG9iYWxjb25maWdzIjtjLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yy5tZXRob2Q9IlBPU1QifWVsc2UgYz1uZXcgUGEodGhpcy5EK3RoaXMuUCgiY3VzdG9tZXIiKSk7dGhpcy5sKGMsdGhpcy5NYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5oZCgiY3VzdG9tZXIiKTthP3RoaXMuUmQ/dGhpcy5BYSgibm9TVk1Db25maWciKToodGhpcy5SZD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuamMoITApfS5iaW5kKHRoaXMpLCEwKX19O0gucHJvdG90eXBlLk1jPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLmIpe3ZhciBjPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShjLnRvU3RyaW5nKCkpfWNhdGNoKGYpe2lmKCF0aGlzLmNhJiZ0aGlzLmEpe3RoaXMuY2E9CiEwO3RoaXMuamMoITApO3JldHVybn19Yz0hMTt0cnl7dmFyIGU9bC5jKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2UmJmUuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCJ0dm5vdyIpJiYoYz0hMCl9Y2F0Y2goZil7fWlmKCEoY3x8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiYoZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGhpZGUiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFncyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzanMiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc3hociIpKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYS5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe31nLnYuaT1kO3RoaXMucGI9bC5tKGQuc3RyaWN0KTt0aGlzLkthPWwubShkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5pYj1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMubz1sLm0oZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsKdGhpcy5hPWwubShkLmVuYWJsZWQpO3RoaXMuSz1kLnRlc3RoaWRlfHwiIjt0aGlzLk89ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5nYT1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuWj1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5RYT1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLkE9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuVT1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmE9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuQWI9ZC5qc3BvcHVwc3x8ITE7dGhpcy5iYT1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5pYT1kLnZwYWlkfHwhMTt0aGlzLmkudnBhaWQ9dGhpcy5pYTt0aGlzLmxiPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMuVz1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMucWI9ZC52bWFwc3x8IiI7dGhpcy5kYT1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuYml0cmF0ZT1kLmJpdHJhdGV8fDFFMzt0aGlzLkViKGQuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2E9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuR2E9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTt0aGlzLmtiPWQueWllbGRsYWJ8fG51bGw7dGhpcy5ZPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7ZC5hbGlhcyYmKHRoaXMuZj1kLmFsaWFzKTshdGhpcy5jYSYmdGhpcy5hPyh0aGlzLmNhPSEwLHRoaXMuamMoITApKTp0aGlzLmEmJiF0aGlzLlFjKCkmJih0aGlzLkt8fHRoaXMuT3x8dGhpcy5OfHx0aGlzLmdhKT90aGlzLmVkPyh0aGlzLkphPXRoaXMuYj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubSh0aGlzLnUpKSx0aGlzLnNhKCksdGhpcy5GKCkpOnRoaXMuT2MoKToodGhpcy5hPSExLHRoaXMuRmEoKSl9fTtILnByb3RvdHlwZS51ZT1mdW5jdGlvbihhKXt0aGlzLkhkPSEwO3ZhciBjPWZ1bmN0aW9uKGQpe2lmKGQ9ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIihefCApIitkKyI9KFteO10rKSIpKSlyZXR1cm4gZFsyXX0oImFkcF9zZWdzIil8fAoiZTAiO2M9dGhpcy5rYi51cmwucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltzZWdzXSIsZW5jb2RlVVJJQ29tcG9uZW50KGMpKTtjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCIsaG9tYWRfdXJsX3N1ZmZpeDpjLGhvbWFkX3VybF9zdWZmaXhfYmFzZTY0OmwuQShjKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2wubGEodGhpcy5zKCksIlBPU1QiLGMsZnVuY3Rpb24oZCl7dHJ5e3ZhciBlPUpTT04ucGFyc2UoZC5yZXNwb25zZVRleHQpfWNhdGNoKGgpe31sLnRyYWNrKCJzdGF0c19oZF95bF9kYXRhIiwoZSYmZS5sZW5ndGgpLnRvU3RyaW5nKCksITApO3RyeXtpZihlJiZlLmxlbmd0aCYmdGhpcy5rYi5wYXJhbWV0ZXIpe3ZhciBmPXRoaXMua2IucGFyYW1ldGVyLnNwbGl0KCJbaWRdIikuam9pbihlWzBdLmlkfHwiMCIpO2Y9Zi5zcGxpdCgiW3NpemVdIikuam9pbihlWzBdLmFkc2l6ZXx8MCk7Zj1mLnNwbGl0KCJbcHJpY2VdIikuam9pbigodGhpcy5rYi5wcmljZV9tdWx0aXBsaWVyPwplWzBdLnByaWNlKnRoaXMua2IucHJpY2VfbXVsdGlwbGllcjplWzBdLnByaWNlKXx8MCk7dGhpcy5RYSs9Zn19Y2F0Y2goaCl7YSgpfWEoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSl9O0gucHJvdG90eXBlLk9jPWZ1bmN0aW9uKCl7dGhpcy5OYygpO3RoaXMuUGMoKX07SC5wcm90b3R5cGUuUGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKE0pe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrTSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK00rIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBjPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKZS53aWR0aD0xO2UuaGVpZ2h0PTE7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtlLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBmPWwuZygxMCksaD1sLmcoMTApLG09bC5nKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGYsZnVuY3Rpb24oKXtkKys7Yz1jLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztjPWMucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihtLGZ1bmN0aW9uKCl7ZCsrO2M9Yy5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIEQ9YXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShtLCJpbmxpbmUiKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShoLCJldmFsIikrCmF0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStsLkEoYShmLCJkYXRhIikpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKTtlLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoRCl9Y2F0Y2goTSl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSl9Y2F0Y2goTyl7fWlmKDMhPWQpe3ZhciBNPWwuRigpO2lmKChNLnVifHxNLnZiKSYmIU0uaWMmJiFsLnJhKCkpe2lmKHRoaXMuaSYmdGhpcy5pLnBsYXllciYmdGhpcy5pLnBsYXllci5sZW5ndGgpe2wudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGMsITApO3JldHVybn1sLmIoInRlbGU1LmRlIil8fGwuYigidGFnZXNzcGllZ2VsLmRlIil8fHRoaXMuQWEoImNzcF8iKwpjKX1sLnRyYWNrKCJzdGF0c19oZF9jc3AiLGMsITApfX0uYmluZCh0aGlzKSwxRTMpfTtILnByb3RvdHlwZS5GYT1mdW5jdGlvbigpe3RoaXMuYj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubSh0aGlzLnUpKTt0aGlzLkYoKX07SC5wcm90b3R5cGUuQmM9ZnVuY3Rpb24oYSl7dGhpcy5HPSEwO3RoaXMuYnx8KHRoaXMuYj10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKGEpKSx0aGlzLkYoKSx0aGlzLnNhKCkpfTtILnByb3RvdHlwZS5OYz1mdW5jdGlvbigpe2lmKHRoaXMuSyl7dmFyIGE9bC5GKCk7aWYoKGEudWJ8fGEudmIpJiZ0aGlzLmdiKCkpdGhpcy5CYyh0aGlzLkhiKTtlbHNle2E9ITE7dHJ5e3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Muc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5LKTtjLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSyk7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGMpO3ZhciBkPTA9PT1jLm9mZnNldFdpZHRofHwwPT09Yy5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChjKTthPWR9Y2F0Y2goZSl7fWE/dGhpcy5CYyh0aGlzLkhiKTp0aGlzLm9iKCl9fWVsc2UgdGhpcy5vYigpfTtILnByb3RvdHlwZS5tZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7ZT1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLGwucygpKSx0aGlzLk1lKGUsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZC5iaW5kKHRoaXMpLGMuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5sZCgpfX1mdW5jdGlvbiBjKCl7dGhpcy5CYyh0aGlzLkhiKX1pZigodGhpcy5OPXRoaXMuZ2EpJiZ0aGlzLk4ubGVuZ3RoKXt2YXIgZD10aGlzLk4uc2xpY2UoKSxlPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5sZCgpfTtILnByb3RvdHlwZS5NZT1mdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gZSgpe2YoKSYmCmMoKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSgpfSwzRTMpO3RoaXMubChuZXcgUGEoYSksZSxmdW5jdGlvbigpe2YoKSYmZCgpfSl9O0gucHJvdG90eXBlLm9iPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtlPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsbC5zKCkpLHRoaXMuTmUoZSwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm1kLmJpbmQodGhpcyksYy5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLm1kKCl9fWZ1bmN0aW9uIGMoKXt0aGlzLkJjKHRoaXMuSGIpfWlmKHRoaXMuTyYmdGhpcy5PLmxlbmd0aCl7dmFyIGQ9dGhpcy5PLnNsaWNlKCksZTthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubWQoKX07SC5wcm90b3R5cGUuTmU9ZnVuY3Rpb24oYSxjLGQpe2Z1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBmKCl7aCgpJiZkKCl9ZnVuY3Rpb24gaCgpe3JldHVybiBtPwood2luZG93LmNsZWFyVGltZW91dChtKSwhMCk6ITF9bC5nKCk7dmFyIG09d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKE0sTyl7Tz09YSYmaCgpJiZmKCl9O3ZhciBEPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRCk7RC5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtELnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO0Qub25sb2FkPWU7RC5vbmVycm9yPWY7RC5zcmM9YTtELmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmKX1jYXRjaChNKXtlKCl9fTtILnByb3RvdHlwZS5sZD1mdW5jdGlvbigpe2lmKHRoaXMuWil0cnl7bC5sYSh0aGlzLlosImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuUz0hbC5tKGEuY2MpO3RoaXMuRmEoKX0uYmluZCh0aGlzKSx0aGlzLm5iLmJpbmQodGhpcykpfWNhdGNoKGEpe3RoaXMubmIoKX1lbHNlIHRoaXMuRmEoKX07CkgucHJvdG90eXBlLm5iPWZ1bmN0aW9uKCl7dGhpcy5iPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMudSkpO3RoaXMuRigpO3RoaXMuc2EoKX07SC5wcm90b3R5cGUuZ2I9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3sidGVzdGFkdGFnc3hociI6ImhlcmUgYmUgZHJhZ29ucyIsICJlbmFibGVkIjp0cnVlfScpLnRlc3RhZHRhZ3N4aHJ8fCFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJjb25maWciOiJoZXJlIGJlIGRyYWdvbnMifScpLmVuYWJsZWR8fCFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6ImhlcmUgYmUgZHJhZ29ucyJ9JykuZW5hYmxlZHx8ImZ1bmN0aW9uKCl7fSI9PT1DdXN0b21FdmVudC50b1N0cmluZygpfHwhMX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fTtILnByb3RvdHlwZS5GPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPSIwIixkPSIwIjt0cnl7bC5yYSgpJiYoYz0iMSIpfWNhdGNoKGUpe2M9CjJ9dGhpcy5HJiYoZD0iMSIpO2wudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYysiIitkLCEwKTtnLmouYigiZ2lnYS5kZSIpJiZ0aGlzLkcmJmwudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuZ2IoKSwhMCk7bC5GKCk7KHRoaXMuSmEmJnRoaXMuYXx8bC5TKCkpJiZ0aGlzLlkmJnRoaXMuR2IoKTt0aGlzLlomJmwudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5TLnRvU3RyaW5nKCksITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMuZmIpKTt0aGlzLmhhJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaGEmJnRoaXMuaGEoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuU30pO2lmKHRoaXMuYSl0cnl7dGhpcy56YT1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2ZldGNoKGEuZmMrYS5QKCJnbG9iYWwiKSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5qc29uKCl9KS50aGVuKGZ1bmN0aW9uKGUpeyExPT09Zy5qLm0oZS5lbmFibGVkKT8oYS5hPQohMSwhMD09PWcuai5tKGUubGVlcm95KSYmY2xlYXJJbnRlcnZhbChhLnphKSk6YS5hPSEwfSkuY2F0Y2goKTtmZXRjaChhLkQrYS5QKCJjdXN0b21lciIpKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBlLmpzb24oKX0pLnRoZW4oZnVuY3Rpb24oZSl7ITE9PT1nLmoubShlLmVuYWJsZWQpPyhhLmE9ITEsITA9PT1nLmoubShlLmxlZXJveSkmJmNsZWFySW50ZXJ2YWwoYS56YSkpOmEuYT0hMH0pLmNhdGNoKCl9LDNFNSl9Y2F0Y2goZSl7fX07SC5wcm90b3R5cGUuR2I9ZnVuY3Rpb24oKXt0aGlzLk09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5NLmlkPWwuZygxMCk7dGhpcy5NLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuTS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk0uY29udGVudFdpbmRvdyxjPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7dGhpcy5ZJiYoYy5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5ZLmxlbmd0aDtlKyspZD0KYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5ZW2VdLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcykpO2Muc3JjPWwuTigiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpfS5iaW5kKHRoaXMpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5NKX07SC5wcm90b3R5cGUuTGI9ZnVuY3Rpb24oKXtpZih0aGlzLkthJiZ0aGlzLlNiKCkpe3ZhciBhPXRoaXMuUWIoKTthJiZhLmpvaW4mJmwudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19O0gucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSxjLGQsZSxmLGgpe2U9dm9pZCAwPT09ZT8hMTplO2Y9dm9pZCAwPT09CmY/ITE6ZjtoPXZvaWQgMD09PWg/ITE6aDt0aGlzLmVhfHwodGhpcy5lYT0wKTt0aGlzLmVhKys7MUUzPHRoaXMuZWEmJiF0aGlzLnhiJiYodGhpcy54Yj0hMCxsLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLCgxRTMpLnRvU3RyaW5nKCksITApKTt2YXIgbT1hLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIik7YT1uZXcgZ2IoYSxjLGQsbnVsbCxtKTtlJiYoYS5GPSEwKTtmJiZsLkFjKCkmJihhLmY9ITApO2gmJihhLmM9ITApO2lmKEQpe3ZhciBEPXBhcnNlSW50KEQsMTApOzA8RCYmKGEudGltZW91dD1EKX1yZXR1cm4gYS5sb2FkKCl9O0gucHJvdG90eXBlLkpiPWZ1bmN0aW9uKCl7dGhpcy5CYnx8KHRoaXMuQmI9ITAsbC5yYSgpfHxsLlcoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIsCntob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYz1udWxsLGQ9bnVsbCxlPSIiO3RyeXsoYz1hLnJlc3BvbnNlWE1MKXx8KGM9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChoKXt0aGlzLkFhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGVbMF0mJihlPWVbMF0pLGUpe2U9ZSYmZS5jaGlsZE5vZGVzJiZlLmNoaWxkTm9kZXNbMF0/ZS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLndhKCl8fChlPWwuYyhlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2E9ZnVuY3Rpb24oaCl7dmFyIG09IiI7dHJ5e2gmJmgudGFyZ2V0JiZoLnRhcmdldC5lcnJvciYmCihtPWgudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKEQpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5BYSgibWVkaWFmaWxlX25vc291cmNlIittKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLkFhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoYyk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsZSk7Zi5sb2FkKCl9ZWxzZSB0aGlzLkFhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5BYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuQWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkFhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLAp0aGlzKSl9O0gucHJvdG90eXBlLktiPWZ1bmN0aW9uKCl7dGhpcy5jKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLmMoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMubChhLHRoaXMuUmMuYmluZCh0aGlzKSx0aGlzLkRjLmJpbmQodGhpcykpfTtILnByb3RvdHlwZS5SYz1mdW5jdGlvbihhKXt2YXIgYz1udWxsLGQ9bnVsbDt0cnl7KGM9YS5yZXNwb25zZVhNTCl8fChjPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWR8fAp0aGlzLlBiKCl9O0gucHJvdG90eXBlLkRjPWZ1bmN0aW9uKCl7fTtILnByb3RvdHlwZS5QYj1mdW5jdGlvbigpe2wuUCh2LlApO2wudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuQWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9O0gucHJvdG90eXBlLnNhPWZ1bmN0aW9uKCl7aWYodGhpcy5hJiZ0aGlzLmJhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuYmEubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5iYVthXTsicmVxdWVzdCI9PWMudHlwZSYmbC5XKGMudXJsLGMuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yy50eXBlKXt2YXIgZD1uZXcgQ2E7d2luZG93W2QuYSgpXT10aGlzO2wuVyhjLnVybCxjLmFsaWFzLG51bGwsZnVuY3Rpb24oZSl7aWYoZS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoZS5yZXNwb25zZVRleHQpfWNhdGNoKGYpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fTtILnByb3RvdHlwZS5RYz1mdW5jdGlvbigpe3JldHVybiAxMDAqCk1hdGgucmFuZG9tKCk8dGhpcy5HYX07dmFyIHdhPXt9O3oucHJvdG90eXBlLk9iPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RoaXMuRmQ9ITB9d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixhLmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGEuYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGEuYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixhLmJpbmQodGhpcykpfTt6LnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dGhpcy5uYXx8KHRoaXMubmE9dGhpcy5nKDEwKSk7cmV0dXJuIHRoaXMubmF9O3oucHJvdG90eXBlLmxiPWZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXt2YXIgZj0obmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fApuYXZpZ2F0b3IuYXx8IngiKSkuc3BsaXQoIiAiKS5qb2luKCIiKSxoPU1hdGgubWF4KE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvNjApLE1hdGgucm91bmQoKERhdGUubm93KCkvMUUzKzEwKS82MCkpLnRvU3RyaW5nKCksbT1mLnNsaWNlKDAsZi5sZW5ndGgvMikuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTtmPWYuc2xpY2UoZi5sZW5ndGgvMikuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTtyZXR1cm4gaCttK2grZitofSgpLGM9ZnVuY3Rpb24oZil7dmFyIGg9MCxtO2lmKDA9PWYubGVuZ3RoKXJldHVybiBoO3ZhciBEPTA7Zm9yKG09Zi5sZW5ndGg7RDxtO0QrKyloPShoPDw1KS1oK2YuY2hhckNvZGVBdChEKSxofD0wO3JldHVybiBNYXRoLmFicyhoKX0oYSkudG9TdHJpbmcoKTtjPShjK2Muc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKSkuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKS5tYXRjaCgvLnsxLDJ9L2cpLm1hcChOdW1iZXIpO2E9YnRvYShhKS5yZXBsYWNlKC9bXmEtel0vZ2ksCiIiKS5zdWJzdHIoMCwxMDApO2Zvcih2YXIgZD0iIixlPTA7ZTxjLmxlbmd0aDtlKyspZCs9YS5jaGFyQXQoY1tlXSk7cmV0dXJuIGR8fCJ6b3JrIn07ei5wcm90b3R5cGUuRGE9ZnVuY3Rpb24oKXt0aGlzLm9hfHwodGhpcy5vYT1NYXRoLnJhbmRvbSgpKTtyZXR1cm4gdGhpcy5vYX07ei5wcm90b3R5cGUuZ2E9ZnVuY3Rpb24oKXt0aGlzLmk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fTt6LnByb3RvdHlwZS5wb3N0TWVzc2FnZT1mdW5jdGlvbihhLGMpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYywiKiIpfTt6LnByb3RvdHlwZS5mPQpmdW5jdGlvbihhLGMsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YyxkYXRhOmR9KX07ei5wcm90b3R5cGUuUWI9ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuUGIoYS5kYXRhKX07ei5wcm90b3R5cGUuUGI9ZnVuY3Rpb24oYSl7aWYodGhpcy5pJiZ0aGlzLmkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGM9dGhpcy5pLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXRoaXMuaSYmdGhpcy5pLmV2ZW50bGlzdGVuZXImJnRoaXMuaS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmkuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX07ei5wcm90b3R5cGUuWj1mdW5jdGlvbihhLGMpe3RoaXMuaS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpjfSl9O3oucHJvdG90eXBlLldhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GKCk7CnJldHVybiBnLnFjPyExOmcudi5iKCJ2cGFpZCIpJiYhYS5yYSYmKGEudWJ8fGEudmIpfTt6LnByb3RvdHlwZS5xYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmIoIm1hcnRoYXN0ZXdhcnQuY29tIil8fHRoaXMuYigiZmFuZG9tLmNvbSIpfHx0aGlzLmIoImdpZ2EuZGUiKXx8dGhpcy5iKCJraW5vLmRlIil8fHRoaXMuYigic3BpZWxldGlwcHMuZGUiKXx8dGhpcy5iKCJkZXNpcmVkLmRlIil9O3oucHJvdG90eXBlLkZiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GKCk7cmV0dXJuIGEudWJ8fGEudmJ8fGEuaWN8fGEuemN9O3oucHJvdG90eXBlLkdiPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYigic3BpZWdlbC5kZSIpfHx0aGlzLmIoIndlYi5kZSIpfHx0aGlzLmIoImdteC5uZXQiKX07ei5wcm90b3R5cGUuSWI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iKCJzcGllZ2VsLmRlIikmJiJwcmVyb2xsIj09PXRoaXMuVSYmLjM+dGhpcy5EYSgpfTt6LnByb3RvdHlwZS5NYj1mdW5jdGlvbigpe3ZhciBhPQpnLnYuYigidmVydGljYWxpenIiKXx8e307cmV0dXJuIHRoaXMucmEoKSYmZy5qLmIoInNwaWVnZWwuZGUiKSYmdGhpcy5EYSgpPChhLnRha2VvdmVyfHwuMTQpfHx0aGlzLkxiKCl9O3oucHJvdG90eXBlLk5iPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmEoKSYmLTEhPT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpfTt6LnByb3RvdHlwZS5MYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJhKCkmJi0xIT09d2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigidmVydGljYWxpenIiKSYmLTEhPT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCImZm9yY2UiKX07ei5wcm90b3R5cGUuTT1mdW5jdGlvbigpe2lmKGcucWMpcmV0dXJuITE7aWYoZy5WZClyZXR1cm4hMDt2YXIgYT1nLnYuYigidmVydGljYWxpenIiKXx8e307cmV0dXJuIGEmJmEuZW5hYmxlZCYmYS5sb2dvJiZ0aGlzLnJhKCl8fHRoaXMuTmIoKX07ei5wcm90b3R5cGUuS2E9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9CndpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIiZzdGFuZGFsb25lIil9O3oucHJvdG90eXBlLnNhPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB0aGlzLmwuZ2V0KCJmZXRjaCIpKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9hY3Rpdml0eSIse2NyZWRlbnRpYWxzOiJvbWl0In0pLnRoZW4oZnVuY3Rpb24oYSl7cmV0dXJuIDIwMCE9PWEuc3RhdHVzfHwiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvYWN0aXZpdHkiIT09YS51cmx9KS5jYXRjaChmdW5jdGlvbigpe3JldHVybiEwfSl9Y2F0Y2goYSl7cmV0dXJuITF9fTt6LnByb3RvdHlwZS55Yj1mdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5ib2R5KXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTthLndpZHRoPTE7YS5oZWlnaHQ9MTthLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsKdmFyIGM9YS5jb250ZW50V2luZG93fWVsc2UgYz13aW5kb3d9Y2F0Y2goTyl7Yz13aW5kb3d9dmFyIGQ9Yy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksZT1jLnNldFRpbWVvdXQuYmluZCh3aW5kb3cpLGY9Yy5kb2N1bWVudC5jcmVhdGVFbGVtZW50LmJpbmQoZG9jdW1lbnQpLGg9Yy5KU09OLG09Yy5KU09OLnBhcnNlLEQ9Yy5DdXN0b21FdmVudDt0cnl7dmFyIE09Yy5mZXRjaC5iaW5kKHdpbmRvdyk7dGhpcy5sLnNldCgiZmV0Y2giLE0pfWNhdGNoKE8pe310aGlzLmwuc2V0KCJjcmVhdGVFbGVtZW50IixmKTt0aGlzLmwuc2V0KCJzZXRJbnRlcnZhbCIsZCk7dGhpcy5sLnNldCgic2V0VGltZW91dCIsZSk7dGhpcy5sLnNldCgiSlNPTiIsaCk7dGhpcy5sLnNldCgiSlNPTi5wYXJzZSIsbSk7dGhpcy5sLnNldCgiQ3VzdG9tRXZlbnQiLEQpO2RvY3VtZW50LmJvZHkmJmEmJmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSl9O3oucHJvdG90eXBlLmthPWZ1bmN0aW9uKGEpe3ZhciBjPQp0aGlzLGQsZTtyZXR1cm4gRmMoZnVuY3Rpb24oZil7cmV0dXJuIDE9PWYuYT8oZD1jLmlhKGEpLGU9e21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9LGJvZHk6ZGEuYSh7aG9tYWRfcmVzb2x2ZV9oYXNoOmR9KX0scWMoZixmZXRjaChhLGUpLnRoZW4oZnVuY3Rpb24oaCl7cmV0dXJuIGguanNvbigpfSkudGhlbihmdW5jdGlvbihoKXtyZXR1cm4gaC51cmx9KSwyKSk6Zi5yZXR1cm4oZi5iKX0pfTt6LnByb3RvdHlwZS5mYj1mdW5jdGlvbihhKXt2YXIgYyxkO3JldHVybiBGYyhmdW5jdGlvbihlKXtyZXR1cm4gMT09ZS5hPyhjPWcuSC5zKCksZD17bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn0sYm9keTpkYS5hKHtob21hZF91cmxfc3VmZml4OmEsaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoOiEwLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH0pfSwKcWMoZSxmZXRjaChjLGQpLnRoZW4oZnVuY3Rpb24oZil7cmV0dXJuIGYuanNvbigpfSkudGhlbihmdW5jdGlvbihmKXtyZXR1cm4gZy5ILmZhKCkucmVwbGFjZSgiW2hhc2hdIixmLmhhc2gpfSksMikpOmUucmV0dXJuKGUuYil9KX07ei5wcm90b3R5cGUuZGE9ZnVuY3Rpb24oYSxjKXtjPXZvaWQgMD09PWM/ITE6Yzt2YXIgZD10aGlzLGUsZjtyZXR1cm4gRmMoZnVuY3Rpb24oaCl7c3dpdGNoKGguYSl7Y2FzZSAxOmlmKCEoZC5CKGEpJiZkLldhKCkmJmQucWIoKSkpe2guYT0yO2JyZWFrfXJldHVybiBxYyhoLGQua2EoYSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gYX0pLDMpO2Nhc2UgMzplPWguYixkLkIoZSl8fDAhPT1lLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfHwoYz0hMCxhPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQoZSkrIiZ0eXBlPWpzIik7Y2FzZSAyOnJldHVybiBhPQpkYS5iKGEpLGY9ZC5vKGEsYyl8fCIiLGQuYmEmJihmPW5ldyBSZXF1ZXN0KGEpKSxxYyhoLGZldGNoKGYpLDQpO2Nhc2UgNDpyZXR1cm4gaC5yZXR1cm4oaC5iKX19KX07ei5wcm90b3R5cGUuQWI9ZnVuY3Rpb24oYSl7dGhpcy5iYT0hMTthJiZhLmluZGV4T2YmJjA8PWEuaW5kZXhPZigiaGRtYz10cnVlIikmJmcucGxheWVyJiZnLnBsYXllci5hYSYmIk9ubHlIT01BRCI9PWcucGxheWVyLmFhKCkmJiFnLkguRyYmKHRoaXMuYmE9ITAsZy5qLnRyYWNrKCJzdGF0c19oZF9ub2hvbWFkIiwiIiwhMCkpfTt6LnByb3RvdHlwZS5vPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1uZXcgZGEoZy5ILm1hKGEpKTtpZih0aGlzLkIoYSkpe3ZhciBmPWUuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTt2YXIgaD1hO2E9ZS5wYXRofWVsc2UgZj1jPyJ2cGFpZCI6Zy5ILnRhKGUuaG9zdCksaD1nLkgucygpLGE9Yz9hOmUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpOwphPWcuSC5DYihhKTtmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOmYsaG9tYWRfdXJsX3N1ZmZpeDphLGhvbWFkX3VybF9zdWZmaXhfYmFzZTY0OmJ0b2EoYS50b1N0cmluZygpKX07dGhpcy5XYSgpJiYoZi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSEwKTtmPU9iamVjdC5hc3NpZ24oe30sZixkKTtkPXttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifSxjcmVkZW50aWFsczoiaW5jbHVkZSIsYm9keTpkYS5hKGYpfTtyZXR1cm4gbmV3IFJlcXVlc3QoaCxkKX07ei5wcm90b3R5cGUuQmI9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5pYShhKSxkPSExO2lmKGMpcmV0dXJuIHRoaXMubGEoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpjfSxmdW5jdGlvbihlKXt0cnl7ZD1KU09OLnBhcnNlKGUucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goZil7fX0sZnVuY3Rpb24oKXt9LCEwKSxkfTt6LnByb3RvdHlwZS5pYT0KZnVuY3Rpb24oYSl7dmFyIGM9L14oaHR0cHM/KTpcL1wvKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspP1wvPyhbYS1mMC05XXs0MH0pXC8/JC9nO2lmKChjPWMuZXhlYyhhKSkmJihjWzJdfHxjWzVdKSl7aWYoY1syXSlyZXR1cm4gY1syXTtpZihjWzVdKXJldHVybiBjWzVdfWVsc2UgaWYoYz0vXihodHRwcz8pOlwvXC8oW3cuLV0qKTo/LiooWzAtOV0rKT9cLz8oW2EtZjAtOV17NDB9KVwvPyQvZywoYz1jLmV4ZWMoYSkpJiZjWzRdKXJldHVybiBjWzRdO3JldHVybiExfTt6LnByb3RvdHlwZS54Yj1mdW5jdGlvbihhLGMpe2lmKGMmJiEoMD50aGlzLmMoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yyl7aWYodGhpcy5FYihhKSlyZXR1cm47KGM9dGhpcy5CYihhKSl8fChjPWEpfTA9PT1jLmluZGV4T2YoIi8vIikmJihjPSJodHRwczoiK2MpO3RoaXMuaS51cmxzW2FdPWM7dGhpcy5pLnVybHNbY109YTt0aGlzLmkuaG9tYWRVcmxzW2FdPWM7dGhpcy5pLm9yaWdpbmFsVXJsc1tjXT0KYX19O3oucHJvdG90eXBlLkViPWZ1bmN0aW9uKGEpe3ZhciBjPSExO3RoaXMuaS5ob21hZFVybHNbYV0mJihjPXRoaXMuaS5ob21hZFVybHNbYV0pO3JldHVybiBjfTt6LnByb3RvdHlwZS50YT1mdW5jdGlvbihhKXt2YXIgYz0hMTt0aGlzLmkub3JpZ2luYWxVcmxzJiZ0aGlzLmkub3JpZ2luYWxVcmxzW2FdJiYoYz10aGlzLmkub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gY307ei5wcm90b3R5cGUuS2I9ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX07ei5wcm90b3R5cGUuemE9ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGM9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYysrO3JldHVybiBjfTt6LnByb3RvdHlwZS5UYj1mdW5jdGlvbihhLGMsZCl7YSYmKGEuc3R5bGVbY109ZCl9O3oucHJvdG90eXBlLnFhPWZ1bmN0aW9uKGEsYyl7Yz10aGlzLkNiKGMpOwpmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLlRiKGEsY1tkXS5rZXksY1tkXS52YWx1ZSl9O3oucHJvdG90eXBlLnpiPWZ1bmN0aW9uKGEpe2lmKCJzdHJpbmciIT09dHlwZW9mIGEpcmV0dXJuIiI7dHJ5e3JldHVybiBhLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Euc2xpY2UoMSl9Y2F0Y2goYyl7cmV0dXJuIiJ9fTt6LnByb3RvdHlwZS5DYj1mdW5jdGlvbihhKXthPWEuc3BsaXQoIjsiKTtmb3IodmFyIGM9W10sZCxlPSIiLGY9MDtmPGEubGVuZ3RoO2YrKyl7dmFyIGg9YVtmXS5zcGxpdCgiOiIpO2Q9aFswXS50cmltKCk7aFsxXSYmaFsxXS50cmltP2U9aFsxXS50cmltKCk6ZT0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoaD1kLnNwbGl0KCItIiksZD1oWzBdK3RoaXMuemIoaFsxXSkpO2Q9e2tleTpkLHZhbHVlOmV9O2MucHVzaChkKX1yZXR1cm4gY307ei5wcm90b3R5cGUuUz1mdW5jdGlvbigpe2Zvcih2YXIgYT0id2ViLmRlIHBjZ2FtZXMuZGUgcGNnYW1lc2hhcmR3YXJlLmRlIHZpZGVvZ2FtZXN6b25lLmRlIGdhbWV6b25lLmRlIGdhbWVzYWt0dWVsbC5kZSBidWZmZWQuZGUgZ29sZW0uZGUiLnNwbGl0KCIgIiksCmM9dGhpcy5GKCksZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKHRoaXMuYihhW2RdKSYmKGMudmJ8fGMuQWN8fGMudWIpKXJldHVybiEwO3JldHVybiExfTt6LnByb3RvdHlwZS5jYT1mdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfTt6LnByb3RvdHlwZS5GYT1mdW5jdGlvbihhLGMpe3ZhciBkPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBmPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWYpcmV0dXJuITE7dmFyIGg9Zi5oZWlnaHQqZi53aWR0aDthPWYud2lkdGg7dmFyIG09Zi5oZWlnaHQ7MD5mLnRvcCYmKG0rPWYudG9wKTtmLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCihtLT1mLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5mLmxlZnQmJihhKz1mLmxlZnQpO2YucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoYS09Zi5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+bSYmKG09MCk7MD5hJiYoYT0wKTswPGgmJihkPTEwMC9oKmEqbSk7ZD49YyYmKGU9ITApO3JldHVybiBlfTt6LnByb3RvdHlwZS5HYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLkZhKGEuZWx8fChhLmRpc3BsYXk/YS5kaXNwbGF5LnhjKCk6e30pLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYyl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPQohMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2EoYSl9LmJpbmQodGhpcyksMTAwKX07ei5wcm90b3R5cGUuU2I9ZnVuY3Rpb24oYSl7Zm9yKDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKX07ei5wcm90b3R5cGUuQj1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YS5tYXRjaCgvXihodHRwcz8pOlwvXC8oW2EtZjAtOV17NDB9KT9cLj8oW1x3XC5cLV0qKVwuKGRhbW9ofGhvbWFkKVwuKFtcd1wuXC1dKik6PyhbMC05XSspP1wvPyhbYS1mMC05XXs0MH0pP1wvPygoXD98IykuKik/JC8pfTt6LnByb3RvdHlwZS5zPWZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9O3oucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKE1hdGguYWJzKGEpKXx8MTA7cmV0dXJuIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLnNwbGl0KCIiKS5zb3J0KGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucmFuZG9tKCktCi41fSkuam9pbigiIikuc3Vic3RyKDAsYSl9O3oucHJvdG90eXBlLmliPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMocmIpe3ZhciBpYj0iIixzYjtmb3Ioc2I9NzswPD1zYjtzYi0tKXt2YXIgamM9cmI+Pj40KnNiJjE1O2liKz1qYy50b1N0cmluZygxNil9cmV0dXJuIGlifWZ1bmN0aW9uIGQocmIsaWIpe3JldHVybiByYjw8aWJ8cmI+Pj4zMi1pYn12YXIgZSxmPUFycmF5KDgwKSxoPTE3MzI1ODQxOTMsbT00MDIzMjMzNDE3LEQ9MjU2MjM4MzEwMixNPTI3MTczMzg3OCxPPTMyODUzNzc1MjA7dmFyIE49YS5sZW5ndGg7dmFyIG1hPVtdO2ZvcihlPTA7ZTxOLTM7ZSs9NCl7dmFyIGthPWEuY2hhckNvZGVBdChlKTw8MjR8YS5jaGFyQ29kZUF0KGUrMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpO21hLnB1c2goa2EpfXN3aXRjaChOJTQpe2Nhc2UgMDplPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmU9YS5jaGFyQ29kZUF0KE4tMSk8PDI0fDgzODg2MDg7YnJlYWs7CmNhc2UgMjplPWEuY2hhckNvZGVBdChOLTIpPDwyNHxhLmNoYXJDb2RlQXQoTi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KE4tMyk8PDI0fGEuY2hhckNvZGVBdChOLTIpPDwxNnxhLmNoYXJDb2RlQXQoTi0xKTw8OHwxMjh9Zm9yKG1hLnB1c2goZSk7MTQhPW1hLmxlbmd0aCUxNjspbWEucHVzaCgwKTttYS5wdXNoKE4+Pj4yOSk7bWEucHVzaChOPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxtYS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspZltlXT1tYVthK2VdO2ZvcihlPTE2Ozc5Pj1lO2UrKylmW2VdPWQoZltlLTNdXmZbZS04XV5mW2UtMTRdXmZbZS0xNl0sMSk7a2E9aDtOPW07dmFyIG5hPUQ7dmFyIFk9TTt2YXIgeGE9Tztmb3IoZT0wOzE5Pj1lO2UrKyl7dmFyIFo9ZChrYSw1KSsoTiZuYXx+TiZZKSt4YStmW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NTt4YT1ZO1k9bmE7bmE9ZChOLDMwKTtOPWthO2thPVp9Zm9yKGU9MjA7Mzk+PWU7ZSsrKVo9CmQoa2EsNSkrKE5ebmFeWSkreGErZltlXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUseGE9WSxZPW5hLG5hPWQoTiwzMCksTj1rYSxrYT1aO2ZvcihlPTQwOzU5Pj1lO2UrKylaPWQoa2EsNSkrKE4mbmF8TiZZfG5hJlkpK3hhK2ZbZV0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHhhPVksWT1uYSxuYT1kKE4sMzApLE49a2Esa2E9Wjtmb3IoZT02MDs3OT49ZTtlKyspWj1kKGthLDUpKyhOXm5hXlkpK3hhK2ZbZV0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHhhPVksWT1uYSxuYT1kKE4sMzApLE49a2Esa2E9WjtoPWgra2EmNDI5NDk2NzI5NTttPW0rTiY0Mjk0OTY3Mjk1O0Q9RCtuYSY0Mjk0OTY3Mjk1O009TStZJjQyOTQ5NjcyOTU7Tz1PK3hhJjQyOTQ5NjcyOTV9Wj1jKGgpK2MobSkrYyhEKStjKE0pK2MoTyk7cmV0dXJuIFoudG9Mb3dlckNhc2UoKX07ei5wcm90b3R5cGUuQT1mdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZCxlLGYsaCxtLEQsTT0wO008YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KE0rKyksCmU9YS5jaGFyQ29kZUF0KE0rKyksZj1hLmNoYXJDb2RlQXQoTSsrKSxoPWQ+PjIsZD0oZCYzKTw8NHxlPj40LG09KGUmMTUpPDwyfGY+PjYsRD1mJjYzLGlzTmFOKGUpP209RD02NDppc05hTihmKSYmKEQ9NjQpLGM9YysiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChtKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChEKTtyZXR1cm4gY307ei5wcm90b3R5cGUuQWM9ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLmhhc093blByb3BlcnR5KCJ2ZW5kb3IiKSYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX07ei5wcm90b3R5cGUuRj1mdW5jdGlvbigpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsYz17fTtjLnZiPS9GaXJlZm94XC98RnhpT1NcLy8udGVzdChhKSYmIS9TZWFtb25rZXlcLy8udGVzdChhKTtjLnpjPS9PUFJcL3xPcGVyYVwvfE9QVFwvLy50ZXN0KGEpO2Mua2U9L1RyaWRlbnRcLzcuMDt8OyBNU0lFLy50ZXN0KGEpO2MuaWM9L0VkZ2VcL3xFZGdcL3xFZGdpT1NcL3xFZGdBXC8vLnRlc3QoYSk7Yy5tZT0vU2Ftc3VuZ0Jyb3dzZXJcLy8udGVzdChhKTtjLnBlPS9ZYUJyb3dzZXJcL3xZb3dzZXJcLy8udGVzdChhKTtjLm9lPS9VQ0Jyb3dzZXJcLy8udGVzdChhKTtjLmllPS9GQkFOfEZCQVYvLnRlc3QoYSk7Yy5sZT0vSW5zdGFncmFtLy50ZXN0KGEpO2MubmU9L1R3aXR0ZXIvLnRlc3QoYSk7Yy5iZD1jLm1lfHxjLnBlfHxjLm9lfHxjLmllfHxjLmxlfHxjLm5lO2MudWI9L0Nocm9tZVwvfENyaU9TXC8vLnRlc3QoYSkmJgohL0Nocm9taXVtXC8vLnRlc3QoYSkmJiFjLnpjJiYhYy5pYyYmIWMuYmQ7Yy5BYz0vU2FmYXJpXC8vLnRlc3QoYSkmJiFjLnZiJiYhYy51YiYmIWMuemMmJiFjLmljJiYhYy5iZDtjLnJhPS9pUGhvbmV8aVBhZHxpUG9kfEFuZHJvaWR8QmxhY2tCZXJyeXxQbGF5Qm9va3xNb2JpbGV8T3BlcmEgTWluaXxJRU1vYmlsZXxGeGlPU3xDcmlPU3xFZGdpT1MvLnRlc3QoYSk7Yy5zZj0hYy52YiYmIWMuemMmJiFjLmtlJiYhYy5pYyYmIWMudWImJiFjLkFjJiYhYy5iZDtjLnJmPS9ib3R8YmluZ2JvdHxnb29nbGVib3R8Y3Jhd2xlcnxzcGlkZXJ8cm9ib3R8Y3Jhd2xpbmcvLnRlc3QoYSk7dHJ5e2MuamU9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuYnx8L0hlYWRsZXNzQ2hyb21lXC8vLnRlc3QoYSl9Y2F0Y2goZCl7Yy5qZT0hMX1yZXR1cm4gY307ei5wcm90b3R5cGUucmE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GKCkucmF9Owp6LnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBjPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZT0xNDtlLS07KWRbY1tlXV09YVtlXXx8IiI7ZC5xdWVyeUtleT17fTtkW2NbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihmLGgsbSl7aCYmKGQucXVlcnlLZXlbaF09bSl9KTtyZXR1cm4gZH07ei5wcm90b3R5cGUudW5pcXVlPQpmdW5jdGlvbihhKXtmb3IodmFyIGM9e30sZD1bXSxlPTAsZj1hLmxlbmd0aDtlPGY7KytlKWMuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksY1thW2VdXT0xKTtyZXR1cm4gZH07ei5wcm90b3R5cGUuRz1mdW5jdGlvbihhKXthPXRoaXMuYyhhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGM9IiI7YVthLmxlbmd0aC0yXSYmKGMrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYys9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGN9O3oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dmFyIGM9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYz13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2MmJi0xPGMuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfTt6LnByb3RvdHlwZS5uYj1mdW5jdGlvbigpe3ZhciBhPSIiLGM9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYz13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsCndpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGM9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZCl7fXJldHVybiBhK2N9O3oucHJvdG90eXBlLkRiPWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBkPVtdLGU9W10sZj0wO2Y8Yy5sZW5ndGg7ZisrKWRbY1tmXV09ITA7Zm9yKGY9MDtmPGEubGVuZ3RoO2YrKylkW2FbZl1dfHxlLnB1c2goYVtmXSk7cmV0dXJuIGV9O3oucHJvdG90eXBlLmdiPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9LTEsZT0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxjPygoZT1hLnNwbGl0KCIlIikpJiYoZT1lWzBdKSxkPU1hdGgucm91bmQoYy8xMDAqZSkpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goZil7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH07ei5wcm90b3R5cGUuWmI9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5nYihhLGMpfTsKei5wcm90b3R5cGUud2E9ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBjPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxjPU1hdGguZmxvb3IoYS82MCksYz10aGlzLmpiKGMpKyI6Iit0aGlzLmpiKE1hdGguZmxvb3IoYS02MCpjKSkpO3JldHVybiBjfTt6LnByb3RvdHlwZS5qYj1mdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX07ei5wcm90b3R5cGUucGE9ZnVuY3Rpb24oYSl7dGhpcy5VPWF9O3oucHJvdG90eXBlLmhhPWZ1bmN0aW9uKGEsYyxkKXtkLnN0YXRlPXRoaXMuVTt0aGlzLmVhKGQpO3RyeXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCl2YXIgZT1uZXcgQ3VzdG9tRXZlbnQoYyx7ZGV0YWlsOmR9KTtlbHNlIGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZS5pbml0Q3VzdG9tRXZlbnQoYywhMSwhMSxkKTthLmRpc3BhdGNoRXZlbnQoZSl9Y2F0Y2goZil7dGhpcy5oYj0KITAsZG9jdW1lbnQuYm9keT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSxhLndpZHRoPTEsYS5oZWlnaHQ9MSxhLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSksYT1hLmNvbnRlbnRXaW5kb3cpOmE9d2luZG93LHdpbmRvdy5DdXN0b21FdmVudD1hLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19O3oucHJvdG90eXBlLlA9ZnVuY3Rpb24oYSl7dmFyIGMsZDtjfHwoYz0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7aWYoYSYmMTAwNT09YS5jb2RlJiYodGhpcy5iKCJmb2N1cyIpfHx0aGlzLmIoImdpZ2EiKSkpe3ZhciBlPSJfIithLmhvbWFkSW1wcmVzc2lvbkFkSWQ7dGhpcy5LfHwodGhpcy5LPXtob21hZEltcHJlc3Npb25BZElkczp7fX0pO3RoaXMuSy5ob21hZEltcHJlc3Npb25BZElkc1tlXT90aGlzLksuaG9tYWRJbXByZXNzaW9uQWRJZHNbZV0rKzp0aGlzLksuaG9tYWRJbXByZXNzaW9uQWRJZHNbZV09MTt0aGlzLnRyYWNrKCJzdGF0c190bXBfYWRzdGFydCIsCnRoaXMuSy5ob21hZEltcHJlc3Npb25BZElkc1tlXSwhMCl9dGhpcy5oYShkLGMsYSk7ZyYmZy5wbGF5ZXImJmcucGxheWVyLmFlJiZnLnBsYXllci5hZShhLm5hbWUsYSl9O3oucHJvdG90eXBlLmE9ZnVuY3Rpb24oYSxjLGQsZSxmLGgpe3ZhciBtPWE7ZCYmYyYmKGM9di5hKGMsZCkpO2MmJihtPXYuYShhLGMpKTtlJiYobT12LmEobSxlKSk7ZiYmKG09di5hKG0sZikpO2gmJihtPXYuYShtLGgpKTt0aGlzLlAobSl9O3oucHJvdG90eXBlLlJiPWZ1bmN0aW9uKGEpe3ZhciBjPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrfHxhLmNvcnJvYm9yYXRlX3RyYWNrKWM9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7dmMmJihjLnNlc3Npb25faWQ9dmMpO2MuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJgooYy5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2MuZXZlbnQ9YS5jb2RlO2Muc2l0ZV9ocmVmPXRoaXMubmIoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpjLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yy5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpjLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpjLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGMudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbik7YS5kdXJhdGlvbiYmKGMuYWRfZHVyYXRpb249YS5kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBjfTt6LnByb3RvdHlwZS4kYj1mdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuRCgpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWEoYSl9Owp6LnByb3RvdHlwZS5lYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLlJiKGEpO2lmKGMpaWYoZy5IJiZnLkguYil7aWYoZy5ILmEpe2lmKCJvYmplY3QiPT10eXBlb2YgYyl0cnl7Yz1KU09OLnN0cmluZ2lmeShjKX1jYXRjaChkKXtjPWMudG9TdHJpbmc/Yy50b1N0cmluZygpOiIifWMmJmMudHJpbSYmKGM9Yy50cmltKCkpO2E9Zy5ILnMoKTtoYihnLkguYyhhLCEwKSwidHJhY2tpbmciKTthPWcuSC5jKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1jO2cuSC5sKGEsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSl9fWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKGMpfS5iaW5kKHRoaXMpLDUwMCl9O3oucHJvdG90eXBlLnRyYWNrPWZ1bmN0aW9uKGEsYyxkKXtpZihkPXZvaWQgMD09PWQ/ITE6ZClpZihnLkgmJmcuSC5iKXtpZihnLkguYSl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YyYmYy50cmltJiYoYz0KYy50cmltKCkpO3ZhciBlPWcuSC5zKCk7aGIoZy5ILmMoZSwhMCksInRyYWNraW5nIik7ZT1nLkguYyhlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGMrIiIpKyIqIjtnLkgubChlLGZ1bmN0aW9uKGYpe3ZhciBoPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihoPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYysiIikmJihoPSExKX1jYXRjaChtKXt9aHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSl9fWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmMsZCl9LmJpbmQodGhpcyksNTAwKX07ei5wcm90b3R5cGUuWT1mdW5jdGlvbihhKXtpZighZ3x8IWcuSC5iKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihnLkguYSl7dmFyIGM9YS5qb2luKCIsIiksZD1nLkgucygpO2Q9Zy5ILmMoZCwhMCk7ZC5kYXRhLmhvbWFkX3RyYWNrPWM7Zy5ILmwoZCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9KX19O3oucHJvdG90eXBlLm1hPWZ1bmN0aW9uKCl7Zy5IJiZnLkguYj9nLkguYSYmZy5ILktiKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksNTAwKX07ei5wcm90b3R5cGUucGI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9O3oucHJvdG90eXBlLkJkPWZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMub2IoYSk6IiJ9O3oucHJvdG90eXBlLm9iPQpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnBiKGEpO2MmJihjPWMudHJpbSgpKTshYyYmYS50ZXh0Q29udGVudCYmKGM9YS50ZXh0Q29udGVudCxjPWMudHJpbSgpKTtyZXR1cm4gY307ei5wcm90b3R5cGUuTj1mdW5jdGlvbihhLGMsZCxlKXtkPXZvaWQgMD09PWQ/ITE6ZDtlPXZvaWQgMD09PWU/e306ZTtpZih0aGlzLkIoYSl8fHRoaXMuS2IoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO2lmKHdpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5nZCYmd2luZG93LnNhbmRib3guZ2RbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdKXt2YXIgZj13aW5kb3cuc2FuZGJveDswPD1mLmdkWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxmLmdkWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpfWlmKHRoaXMudGEoYSkpcmV0dXJuIHRoaXMudGEoYSk7Zj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTsKZi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkEoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtlJiZlLnBvc3QmJihmWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihmLmhvbWFkX3ZwYWlkX3NjcmlwdGluamVjdD1KU09OLnN0cmluZ2lmeSh7aGVhZDoiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyJ9KSxmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO2UmJmUub25seVVSTCYmKGYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBoPSExO2Q9ITE7ZD10aGlzLmMoYSk7ZD10aGlzLlcoYSxjLnRhKGQuaG9zdCksZixmdW5jdGlvbihtKXtoPW0ucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sCmMsITApO3RyeXtofHwoaD1kKSxoPUpTT04ucGFyc2UoaC50b1N0cmluZygpKX1jYXRjaChtKXtoPSExfWgudXJsJiZoLmhhc2gmJihoPWMuZmEoKS5yZXBsYWNlKCJbaGFzaF0iLGguaGFzaCkpO3RoaXMueGIoaCxhKTtyZXR1cm4gaH07ei5wcm90b3R5cGUuVz1mdW5jdGlvbihhLGMsZCxlLGYsaCxtLEQpe209dm9pZCAwPT09bT8hMTptO0Q9dm9pZCAwPT09RD8hMTpEO3ZhciBNPWh8fGcuSDtoPSEwO0QmJihoPSExKTtpZihNJiZNLmIpaWYoTS5hKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goTil7ZihOKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpZigpO2Vsc2V7aGIoTS5jKGEsaCksImxvYWRSZXNvdXJjZVRocm91Z2hIb21hZCIpO2g9TS5jKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YztoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIE8gaW4gZCloLmRhdGFbT109ZFtPXTtyZXR1cm4gTS5sKGgsZSxmLCExLAohMSxtKX19ZWxzZSBmKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVyhhLGMsZCxlLGYsTSxtLEQpfS5iaW5kKHRoaXMpLDUwMCl9O3oucHJvdG90eXBlLmxhPWZ1bmN0aW9uKGEsYyxkLGUsZixoKXt2YXIgbT0hMDttPXZvaWQgMD09PW0/ITE6bTt2YXIgRD0hMDsodm9pZCAwPT09aD8wOmgpJiYoRD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIE0gaW4gaClkKz0iJiIrTSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbTV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIE89bmV3IFhNTEh0dHBSZXF1ZXN0O08ub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWV8fDQhPU8ucmVhZHlTdGF0ZXx8MjAwIT1PLnN0YXR1cyYmMjAxIT1PLnN0YXR1c3x8ZShPKTtmJiY0PT1PLnJlYWR5U3RhdGUmJjIwMCE9Ty5zdGF0dXMmJjIwMSE9Ty5zdGF0dXMmJmYoTyl9O3RyeXtPLm9wZW4oYyxhLEQpLE8ud2l0aENyZWRlbnRpYWxzPW0sMDxkLmxlbmd0aCYmCk8uc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksTy5zZW5kKGQpfWNhdGNoKE4pe2YmJmYoKX19O3oucHJvdG90eXBlLkpiPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITE7aWYoYylmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKylpZihjW2VdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfTt6LnByb3RvdHlwZS5tPWZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9O3ZhciBsPW5ldyB6O2cuaj1sO2cuai5PYigpO3ZhciBEYT1sO3YucHJvdG90eXBlLmdldEVycm9yQ29kZT1mdW5jdGlvbigpe3JldHVybiIifTt2LnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX07di5hPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9e30sZTtmb3IoZSBpbiBjKWRbZV09Y1tlXTtmb3IoZSBpbiBhKWRbZV09YVtlXTtyZXR1cm4gZH07di5jYT17Y29kZToiMTAwMCIsCnR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O3YuaT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07di5nYT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTt2Lk89e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07di5pYT17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTt2LkE9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O3YubD17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O3YuRj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07di5EPXtjb2RlOiIxMDA4IiwKdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O3YuZj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07di5tPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O3YuZGE9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTt2LlU9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O3YuUD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O3YuaGE9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O3YuTT17Y29kZToiMTAxNSIsCnR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07di5OPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07di5nPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O3YuYj17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O3YuYz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O3YudT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O3Yucz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O3YuQj17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiYWRQYXVzZSJ9O3YuRz17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O3Yubz17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O3YuZWE9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07di5XPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O3YuWGE9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O3YuJGE9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTt2Lks9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTt2LmZhPXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTsKdi5iYT17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O3YuWj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O3YuWT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTt2LlM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9OyhmdW5jdGlvbihhLGMpeyJvYmplY3QiPT09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT09dHlwZW9mIG1vZHVsZT9jKGV4cG9ydHMpOiJmdW5jdGlvbiI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUucWY/ZGVmaW5lKFsiZXhwb3J0cyJdLGMpOmMoYS5rZj17fSl9KSh0aGlzLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMocCl7InN0cmluZyIhPT0KdHlwZW9mIHAmJihwPVN0cmluZyhwKSk7aWYoL1teYS16MC05XC0jJCUmJyorLl5fYHx+XS9pLnRlc3QocCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWUiKTtyZXR1cm4gcC50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIGQocCl7InN0cmluZyIhPT10eXBlb2YgcCYmKHA9U3RyaW5nKHApKTtyZXR1cm4gcH1mdW5jdGlvbiBlKHApe3ZhciBCPXtuZXh0OmZ1bmN0aW9uKCl7dmFyIEo9cC5zaGlmdCgpO3JldHVybntkb25lOnZvaWQgMD09PUosdmFsdWU6Sn19fTtaLkRkJiYoVWEoKSx1YigpLEJbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiBCfSk7cmV0dXJuIEJ9ZnVuY3Rpb24gZihwKXt0aGlzLm1hcD17fTtwIGluc3RhbmNlb2YgZj9wLmZvckVhY2goZnVuY3Rpb24oQixKKXt0aGlzLmFwcGVuZChKLEIpfSx0aGlzKTpBcnJheS5pc0FycmF5KHApP3AuZm9yRWFjaChmdW5jdGlvbihCKXt0aGlzLmFwcGVuZChCWzBdLApCWzFdKX0sdGhpcyk6cCYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocCkuZm9yRWFjaChmdW5jdGlvbihCKXt0aGlzLmFwcGVuZChCLHBbQl0pfSx0aGlzKX1mdW5jdGlvbiBoKHApe2lmKHAuYm9keVVzZWQpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoIkFscmVhZHkgcmVhZCIpKTtwLmJvZHlVc2VkPSEwfWZ1bmN0aW9uIG0ocCl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKEIsSil7cC5vbmxvYWQ9ZnVuY3Rpb24oKXtCKHAucmVzdWx0KX07cC5vbmVycm9yPWZ1bmN0aW9uKCl7SihwLmVycm9yKX19KX1mdW5jdGlvbiBEKHApe3ZhciBCPW5ldyBGaWxlUmVhZGVyLEo9bShCKTtCLnJlYWRBc0FycmF5QnVmZmVyKHApO3JldHVybiBKfWZ1bmN0aW9uIE0ocCl7cD1uZXcgVWludDhBcnJheShwKTtmb3IodmFyIEI9QXJyYXkocC5sZW5ndGgpLEo9MDtKPHAubGVuZ3RoO0orKylCW0pdPVN0cmluZy5mcm9tQ2hhckNvZGUocFtKXSk7cmV0dXJuIEIuam9pbigiIil9CmZ1bmN0aW9uIE8ocCl7aWYocC5zbGljZSlyZXR1cm4gcC5zbGljZSgwKTt2YXIgQj1uZXcgVWludDhBcnJheShwLmJ5dGVMZW5ndGgpO0Iuc2V0KG5ldyBVaW50OEFycmF5KHApKTtyZXR1cm4gQi5idWZmZXJ9ZnVuY3Rpb24gTigpe3RoaXMuYm9keVVzZWQ9ITE7dGhpcy5zZD1mdW5jdGlvbihwKXsodGhpcy5hYz1wKT8ic3RyaW5nIj09PXR5cGVvZiBwP3RoaXMuYmM9cDpaLmJsb2ImJkJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2YocCk/dGhpcy5yYj1wOlouZm9ybURhdGEmJkZvcm1EYXRhLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKHApP3RoaXMucmQ9cDpaLnNlYXJjaFBhcmFtcyYmVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKHApP3RoaXMuYmM9cC50b1N0cmluZygpOlouYXJyYXlCdWZmZXImJlouYmxvYiYmcCYmRGF0YVZpZXcucHJvdG90eXBlLmlzUHJvdG90eXBlT2YocCk/KHRoaXMuYmI9TyhwLmJ1ZmZlciksdGhpcy5hYz1uZXcgQmxvYihbdGhpcy5iYl0pKToKWi5hcnJheUJ1ZmZlciYmKEFycmF5QnVmZmVyLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKHApfHxpYihwKSk/dGhpcy5iYj1PKHApOnRoaXMuYmM9cD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocCk6dGhpcy5iYz0iIjt0aGlzLmhlYWRlcnMuZ2V0KCJjb250ZW50LXR5cGUiKXx8KCJzdHJpbmciPT09dHlwZW9mIHA/dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC10eXBlIiwidGV4dC9wbGFpbjtjaGFyc2V0PVVURi04Iik6dGhpcy5yYiYmdGhpcy5yYi50eXBlP3RoaXMuaGVhZGVycy5zZXQoImNvbnRlbnQtdHlwZSIsdGhpcy5yYi50eXBlKTpaLnNlYXJjaFBhcmFtcyYmVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKHApJiZ0aGlzLmhlYWRlcnMuc2V0KCJjb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCIpKX07Wi5ibG9iJiYodGhpcy5ibG9iPWZ1bmN0aW9uKCl7dmFyIHA9aCh0aGlzKTsKaWYocClyZXR1cm4gcDtpZih0aGlzLnJiKXJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5yYik7aWYodGhpcy5iYilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLmJiXSkpO2lmKHRoaXMucmQpdGhyb3cgRXJyb3IoImNvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgYmxvYiIpO3JldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuYmNdKSl9LHRoaXMuYXJyYXlCdWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYj9oKHRoaXMpfHxQcm9taXNlLnJlc29sdmUodGhpcy5iYik6dGhpcy5ibG9iKCkudGhlbihEKX0pO3RoaXMudGV4dD1mdW5jdGlvbigpe3ZhciBwPWgodGhpcyk7aWYocClyZXR1cm4gcDtpZih0aGlzLnJiKXtwPXRoaXMucmI7dmFyIEI9bmV3IEZpbGVSZWFkZXIsSj1tKEIpO0IucmVhZEFzVGV4dChwKTtyZXR1cm4gSn1pZih0aGlzLmJiKXJldHVybiBQcm9taXNlLnJlc29sdmUoTSh0aGlzLmJiKSk7aWYodGhpcy5yZCl0aHJvdyBFcnJvcigiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0Iik7CnJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iYyl9O1ouZm9ybURhdGEmJih0aGlzLmZvcm1EYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oa2EpfSk7dGhpcy5qc29uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oSlNPTi5wYXJzZSl9O3JldHVybiB0aGlzfWZ1bmN0aW9uIG1hKHAsQil7Qj1CfHx7fTt2YXIgSj1CLmJvZHk7aWYocCBpbnN0YW5jZW9mIG1hKXtpZihwLmJvZHlVc2VkKXRocm93IG5ldyBUeXBlRXJyb3IoIkFscmVhZHkgcmVhZCIpO3RoaXMudXJsPXAudXJsO3RoaXMuY3JlZGVudGlhbHM9cC5jcmVkZW50aWFscztCLmhlYWRlcnN8fCh0aGlzLmhlYWRlcnM9bmV3IGYocC5oZWFkZXJzKSk7dGhpcy5tZXRob2Q9cC5tZXRob2Q7dGhpcy5tb2RlPXAubW9kZTt0aGlzLnNpZ25hbD1wLnNpZ25hbDtKfHxudWxsPT1wLmFjfHwoSj1wLmFjLHAuYm9keVVzZWQ9ITApfWVsc2UgdGhpcy51cmw9U3RyaW5nKHApO3RoaXMuY3JlZGVudGlhbHM9CkIuY3JlZGVudGlhbHN8fHRoaXMuY3JlZGVudGlhbHN8fCJzYW1lLW9yaWdpbiI7aWYoQi5oZWFkZXJzfHwhdGhpcy5oZWFkZXJzKXRoaXMuaGVhZGVycz1uZXcgZihCLmhlYWRlcnMpO3A9Qi5tZXRob2R8fHRoaXMubWV0aG9kfHwiR0VUIjt2YXIgcGE9cC50b1VwcGVyQ2FzZSgpO3RoaXMubWV0aG9kPS0xPHNiLmluZGV4T2YocGEpP3BhOnA7dGhpcy5tb2RlPUIubW9kZXx8dGhpcy5tb2RlfHxudWxsO3RoaXMuc2lnbmFsPUIuc2lnbmFsfHx0aGlzLnNpZ25hbDt0aGlzLnJlZmVycmVyPW51bGw7aWYoKCJHRVQiPT09dGhpcy5tZXRob2R8fCJIRUFEIj09PXRoaXMubWV0aG9kKSYmSil0aHJvdyBuZXcgVHlwZUVycm9yKCJCb2R5IG5vdCBhbGxvd2VkIGZvciBHRVQgb3IgSEVBRCByZXF1ZXN0cyIpO3RoaXMuc2QoSil9ZnVuY3Rpb24ga2EocCl7dmFyIEI9bmV3IEZvcm1EYXRhO3AudHJpbSgpLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbihKKXtpZihKKXt2YXIgcGE9Si5zcGxpdCgiPSIpOwpKPXBhLnNoaWZ0KCkucmVwbGFjZSgvXCsvZywiICIpO3BhPXBhLmpvaW4oIj0iKS5yZXBsYWNlKC9cKy9nLCIgIik7Qi5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KEopLGRlY29kZVVSSUNvbXBvbmVudChwYSkpfX0pO3JldHVybiBCfWZ1bmN0aW9uIG5hKHApe3ZhciBCPW5ldyBmO3AucmVwbGFjZSgvXHI/XG5bXHQgXSsvZywiICIpLnNwbGl0KC9ccj9cbi8pLmZvckVhY2goZnVuY3Rpb24oSil7Sj1KLnNwbGl0KCI6Iik7dmFyIHBhPUouc2hpZnQoKS50cmltKCk7cGEmJkIuYXBwZW5kKHBhLEouam9pbigiOiIpLnRyaW0oKSl9KTtyZXR1cm4gQn1mdW5jdGlvbiBZKHAsQil7Qnx8KEI9e30pO3RoaXMudHlwZT0iZGVmYXVsdCI7dGhpcy5zdGF0dXM9dm9pZCAwPT09Qi5zdGF0dXM/MjAwOkIuc3RhdHVzO3RoaXMub2s9MjAwPD10aGlzLnN0YXR1cyYmMzAwPnRoaXMuc3RhdHVzO3RoaXMuc3RhdHVzVGV4dD0ic3RhdHVzVGV4dCJpbiBCP0Iuc3RhdHVzVGV4dDoiT0siO3RoaXMuaGVhZGVycz0KbmV3IGYoQi5oZWFkZXJzKTt0aGlzLnVybD1CLnVybHx8IiI7dGhpcy5zZChwKX1mdW5jdGlvbiB4YShwLEIpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihKLHBhKXtmdW5jdGlvbiB3Yygpe2FhLmFib3J0KCl9dmFyIEVhPW5ldyBtYShwLEIpO2lmKEVhLnNpZ25hbCYmRWEuc2lnbmFsLmFib3J0ZWQpcmV0dXJuIHBhKG5ldyBhLkRPTUV4Y2VwdGlvbigiQWJvcnRlZCIsIkFib3J0RXJyb3IiKSk7dmFyIGFhPW5ldyBYTUxIdHRwUmVxdWVzdDthYS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgRGI9e3N0YXR1czphYS5zdGF0dXMsc3RhdHVzVGV4dDphYS5zdGF0dXNUZXh0LGhlYWRlcnM6bmEoYWEuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCl8fCIiKX07RGIudXJsPSJyZXNwb25zZVVSTCJpbiBhYT9hYS5yZXNwb25zZVVSTDpEYi5oZWFkZXJzLmdldCgiWC1SZXF1ZXN0LVVSTCIpO0oobmV3IFkoInJlc3BvbnNlImluIGFhP2FhLnJlc3BvbnNlOmFhLnJlc3BvbnNlVGV4dCxEYikpfTthYS5vbmVycm9yPQpmdW5jdGlvbigpe3BhKG5ldyBUeXBlRXJyb3IoIk5ldHdvcmsgcmVxdWVzdCBmYWlsZWQiKSl9O2FhLm9udGltZW91dD1mdW5jdGlvbigpe3BhKG5ldyBUeXBlRXJyb3IoIk5ldHdvcmsgcmVxdWVzdCBmYWlsZWQiKSl9O2FhLm9uYWJvcnQ9ZnVuY3Rpb24oKXtwYShuZXcgYS5ET01FeGNlcHRpb24oIkFib3J0ZWQiLCJBYm9ydEVycm9yIikpfTthYS5vcGVuKEVhLm1ldGhvZCxFYS51cmwsITApOyJpbmNsdWRlIj09PUVhLmNyZWRlbnRpYWxzP2FhLndpdGhDcmVkZW50aWFscz0hMDoib21pdCI9PT1FYS5jcmVkZW50aWFscyYmKGFhLndpdGhDcmVkZW50aWFscz0hMSk7InJlc3BvbnNlVHlwZSJpbiBhYSYmWi5ibG9iJiYoYWEucmVzcG9uc2VUeXBlPSJibG9iIik7RWEuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKERiLEtjKXthYS5zZXRSZXF1ZXN0SGVhZGVyKEtjLERiKX0pO0VhLnNpZ25hbCYmKEVhLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsd2MpLGFhLm9ucmVhZHlzdGF0ZWNoYW5nZT0KZnVuY3Rpb24oKXs0PT09YWEucmVhZHlTdGF0ZSYmRWEuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0Iix3Yyl9KTthYS5zZW5kKCJ1bmRlZmluZWQiPT09dHlwZW9mIEVhLmFjP251bGw6RWEuYWMpfSl9VWEoKTt2YXIgWj17c2VhcmNoUGFyYW1zOiJVUkxTZWFyY2hQYXJhbXMiaW4gc2VsZixEZDoiU3ltYm9sImluIHNlbGYmJiJpdGVyYXRvciJpbiBTeW1ib2wsYmxvYjoiRmlsZVJlYWRlciJpbiBzZWxmJiYiQmxvYiJpbiBzZWxmJiYhMCxmb3JtRGF0YToiRm9ybURhdGEiaW4gc2VsZixhcnJheUJ1ZmZlcjoiQXJyYXlCdWZmZXIiaW4gc2VsZn07aWYoWi5hcnJheUJ1ZmZlcil2YXIgcmI9IltvYmplY3QgSW50OEFycmF5XTtbb2JqZWN0IFVpbnQ4QXJyYXldO1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldO1tvYmplY3QgSW50MTZBcnJheV07W29iamVjdCBVaW50MTZBcnJheV07W29iamVjdCBJbnQzMkFycmF5XTtbb2JqZWN0IFVpbnQzMkFycmF5XTtbb2JqZWN0IEZsb2F0MzJBcnJheV07W29iamVjdCBGbG9hdDY0QXJyYXldIi5zcGxpdCgiOyIpLAppYj1BcnJheUJ1ZmZlci5pc1ZpZXd8fGZ1bmN0aW9uKHApe3JldHVybiBwJiYtMTxyYi5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwKSl9O2YucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihwLEIpe3A9YyhwKTtCPWQoQik7dmFyIEo9dGhpcy5tYXBbcF07dGhpcy5tYXBbcF09Sj9KKyIsICIrQjpCfTtmLnByb3RvdHlwZVsiZGVsZXRlIl09ZnVuY3Rpb24ocCl7ZGVsZXRlIHRoaXMubWFwW2MocCldfTtmLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24ocCl7cD1jKHApO3JldHVybiB0aGlzLmhhcyhwKT90aGlzLm1hcFtwXTpudWxsfTtmLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMubWFwLmhhc093blByb3BlcnR5KGMocCkpfTtmLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24ocCxCKXt0aGlzLm1hcFtjKHApXT1kKEIpfTtmLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHAsQil7Zm9yKHZhciBKIGluIHRoaXMubWFwKXRoaXMubWFwLmhhc093blByb3BlcnR5KEopJiYKcC5jYWxsKEIsdGhpcy5tYXBbSl0sSix0aGlzKX07Zi5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3ZhciBwPVtdO3RoaXMuZm9yRWFjaChmdW5jdGlvbihCLEope3AucHVzaChKKX0pO3JldHVybiBlKHApfTtmLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXt2YXIgcD1bXTt0aGlzLmZvckVhY2goZnVuY3Rpb24oQil7cC5wdXNoKEIpfSk7cmV0dXJuIGUocCl9O2YucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXt2YXIgcD1bXTt0aGlzLmZvckVhY2goZnVuY3Rpb24oQixKKXtwLnB1c2goW0osQl0pfSk7cmV0dXJuIGUocCl9O1ouRGQmJihVYSgpLHViKCksZi5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1mLnByb3RvdHlwZS5lbnRyaWVzKTt2YXIgc2I9IkRFTEVURSBHRVQgSEVBRCBPUFRJT05TIFBPU1QgUFVUIi5zcGxpdCgiICIpO04uY2FsbChtYS5wcm90b3R5cGUpO04uY2FsbChZLnByb3RvdHlwZSk7WS5lcnJvcj1mdW5jdGlvbigpe3ZhciBwPW5ldyBZKG51bGwsCntzdGF0dXM6MCxzdGF0dXNUZXh0OiIifSk7cC50eXBlPSJlcnJvciI7cmV0dXJuIHB9O3ZhciBqYz1bMzAxLDMwMiwzMDMsMzA3LDMwOF07WS5yZWRpcmVjdD1mdW5jdGlvbihwLEIpe2lmKC0xPT09amMuaW5kZXhPZihCKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCBzdGF0dXMgY29kZSIpO3JldHVybiBuZXcgWShudWxsLHtzdGF0dXM6QixoZWFkZXJzOntsb2NhdGlvbjpwfX0pfTthLkRPTUV4Y2VwdGlvbj1zZWxmLkRPTUV4Y2VwdGlvbjt0cnl7bmV3IGEuRE9NRXhjZXB0aW9ufWNhdGNoKHApe2EuRE9NRXhjZXB0aW9uPWZ1bmN0aW9uKEIsSil7dGhpcy5tZXNzYWdlPUI7dGhpcy5uYW1lPUo7dGhpcy5zdGFjaz1FcnJvcihCKS5zdGFja30sYS5ET01FeGNlcHRpb24ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxhLkRPTUV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I9YS5ET01FeGNlcHRpb259eGEuYT0hMDtzZWxmLmZldGNofHwoc2VsZi5mZXRjaD0KeGEsc2VsZi5IZWFkZXJzPWYsc2VsZi5SZXF1ZXN0PW1hLHNlbGYuUmVzcG9uc2U9WSk7YS5IZWFkZXJzPWY7YS5SZXF1ZXN0PW1hO2EuUmVzcG9uc2U9WTthLmZldGNoPXhhO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0pO2RhLmE9ZnVuY3Rpb24oYSxjKXtjPXZvaWQgMD09PWM/ITA6YztyZXR1cm4gT2JqZWN0LmtleXMoYSkubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBjP1tkLGFbZF1dLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oIj0iKTpbZCxhW2RdXS5qb2luKCI9Iil9KS5qb2luKCImIil9O2RhLmI9ZnVuY3Rpb24oYSl7W3twYXR0ZXJuOi9cWyhyYW5kb218cm5kfGNhY2hlYnVzdGVyfGNvcnJlbGF0b3IpXF0vZyx2YWx1ZTpnLmoucygxMCl9LHtwYXR0ZXJuOi9cWyhyZWZlcnJlcl91cmwpXF0vZyx2YWx1ZTpkb2N1bWVudC5yZWZlcnJlcn0se3BhdHRlcm46L1xbKGRlc2NyaXB0aW9uX3VybHx1cmwpXF0vZyx2YWx1ZTpkb2N1bWVudC5sb2NhdGlvbi5ocmVmfSwKe3BhdHRlcm46L1xbKHRpbWV8dGltZXN0YW1wKVxdL2csdmFsdWU6KG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKX1dLmZvckVhY2goZnVuY3Rpb24oYyl7YT1hLnJlcGxhY2UoYy5wYXR0ZXJuLGMudmFsdWUpfSk7cmV0dXJuIGF9O2RhLnByb3RvdHlwZS5sPWZ1bmN0aW9uKCl7dGhpcy5hLnF1ZXJ5S2V5LmdkcHJfY29uc2VudD0iW2dkcHJfY29uc2VudF0iO3RoaXMuYS5xdWVyeT1kYS5hKHRoaXMuYS5xdWVyeUtleSwhMSk7dGhpcy5jKCl9O2RhLnByb3RvdHlwZS5pPWZ1bmN0aW9uKGEsYyl7dGhpcy5hLnF1ZXJ5S2V5W2FdPWM7dGhpcy5hLnF1ZXJ5PWRhLmEodGhpcy5hLnF1ZXJ5S2V5LCExKTt0aGlzLmMoKX07ZGEucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5xdWVyeUtleVthXX07ZGEucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5xdWVyeUtleS5oYXNPd25Qcm9wZXJ0eShhKX07ZGEucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXt0aGlzLnBhcnNlKHRoaXMudG9TdHJpbmcoKSl9OwpkYS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5hLnByb3RvY29sLmxlbmd0aD90aGlzLmEucHJvdG9jb2wrIjovLyI6IiIsdGhpcy5hLnZkLHRoaXMuYS5wYXRoLHRoaXMuYS5xdWVyeS5sZW5ndGg/Ij8iK3RoaXMuYS5xdWVyeToiIix0aGlzLmEuYW5jaG9yLmxlbmd0aD8iIyIrdGhpcy5hLmFuY2hvcjoiIl0uam9pbigiIil9O2RhLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhKXt2YXIgYz10aGlzO2E9ZGEuYihhKTt0aGlzLmY9dGhpcy52LmRkW3RoaXMudi5LZT8ic3RyaWN0IjoibG9vc2UiXS5leGVjKGEpO2E9MTQ7Zm9yKHZhciBkPXt9O2EtLTspZFt0aGlzLnYua2V5W2FdXT10aGlzLmZbYV18fCIiO2RbdGhpcy52LnEubmFtZV09e307ZFt0aGlzLnYua2V5WzEyXV0ucmVwbGFjZSh0aGlzLnYucS5kZCxmdW5jdGlvbihlLGYsaCl7ZiYmKGRbYy52LnEubmFtZV1bZl09aCl9KTtyZXR1cm4gZH07UWEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGEucHJvdG90eXBlLAp7djp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJue0tlOiExLGtleToic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VyaW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKSxxOntuYW1lOiJxdWVyeUtleSIsZGQ6Lyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nfSxkZDp7c3RyaWN0Oi9eKD86KFteOlwvPyNdKyk6KT8oPzpcL1wvKCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSk/KCgoKD86W14/I1wvXSpcLykqKShbXj8jXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLGxvb3NlOi9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvfX19fSwKcHJvdG9jb2w6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEucHJvdG9jb2x9fSx2ZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS52ZH19LGhvc3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuaG9zdH19LHBhdGg6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEucGF0aH19LHF1ZXJ5Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLnF1ZXJ5fX0sYW5jaG9yOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLmFuY2hvcn19fSk7dmEucHJvdG90eXBlLmNhPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuTS5oYXMoYSk/KGModGhpcy5NLmdldChhKSksCiEwKTohMX07dmEucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGEsYyxkKXtkPXZvaWQgMD09PWQ/ITE6ZDt0aGlzLkYuaGFzKGEpfHx0aGlzLkYuc2V0KGEsW10pO3RoaXMuRi5nZXQoYSkucHVzaChjKTtkJiZ0aGlzLmNhKGEsYyl9O3ZhLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGEsYyxkKXtkPXZvaWQgMD09PWQ/ITE6ZDt0aGlzLm8uaGFzKGEpfHx0aGlzLm8uc2V0KGEsW10pO2QmJnRoaXMuY2EoYSxjKXx8dGhpcy5vLmdldChhKS5wdXNoKGMpfTt2YS5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXt2YXIgYz12b2lkIDA9PT1jPyEwOmM7aWYoITA9PT1jKXRoaXMuRi5kZWxldGUoYSksdGhpcy5vLmRlbGV0ZShhKTtlbHNle3ZhciBkPWZ1bmN0aW9uKGUpe3ZhciBmPWUuZ2V0KGEpO2YmJmUuc2V0KGEsZi5maWx0ZXIoZnVuY3Rpb24oaCl7cmV0dXJuIGghPT1jfSkpfTtkKHRoaXMuRik7ZCh0aGlzLm8pfX07dmEucHJvdG90eXBlLko9ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGgsbSxEKXtmb3IodmFyIE09CltdLE89MjtPPGFyZ3VtZW50cy5sZW5ndGg7KytPKU1bTy0yXT1hcmd1bWVudHNbT107KE89aC5nZXQobSkpJiZPLmxlbmd0aCYmTy5mb3JFYWNoKGZ1bmN0aW9uKE4pe04uYXBwbHkobnVsbCxGYihNKSl9KX1mb3IodmFyIGU9W10sZj0xO2Y8YXJndW1lbnRzLmxlbmd0aDsrK2YpZVtmLTFdPWFyZ3VtZW50c1tmXTt0aGlzLk0uc2V0LmFwcGx5KHRoaXMuTSxbYV0uY29uY2F0KEZiKGUpKSk7ZC5hcHBseShudWxsLFt0aGlzLm8sYV0uY29uY2F0KEZiKGUpKSk7ZC5hcHBseShudWxsLFt0aGlzLkYsYV0uY29uY2F0KEZiKGUpKSk7dGhpcy5vLmRlbGV0ZShhKX07Q2EucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dmFyIGM9MCxkO2lmKDA9PWEubGVuZ3RoKXJldHVybiBjO3ZhciBlPTA7Zm9yKGQ9YS5sZW5ndGg7ZTxkO2UrKyl7dmFyIGY9YS5jaGFyQ29kZUF0KGUpO2M9KGM8PDUpLWMrZjtjfD0wfXJldHVybiBNYXRoLmFicyhjKX07Q2EucHJvdG90eXBlLnlhPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8KMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuYXx8IngiKX07Q2EucHJvdG90eXBlLmk9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX07Q2EucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhLDEwKTtyZXR1cm4gNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hP1N0cmluZy5mcm9tQ2hhckNvZGUoYSk6MD49CmE/IiI6NjU+YT90aGlzLmIoYSs2NSk6OTA8YT90aGlzLmIoTWF0aC5yb3VuZChhLzIpKTphLnRvU3RyaW5nKCl9O0NhLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1hLmxlbmd0aC0xLGQ9IiI7MDw9YztkKz1hW2MtLV0pO3JldHVybiBkfTtDYS5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZyh0aGlzLnlhKCkpO2E9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpO2Zvcih2YXIgYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYys9dGhpcy5iKGFbZF0pOzA9PWMubGVuZ3RoJiYoYz0iem9yayIpO3JldHVybiBjfTtDYS5wcm90b3R5cGUuYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmEoKSsiMiJ9O0NhLnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nKHRoaXMuaSgpKTthPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKTtmb3IodmFyIGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWMrPQp0aGlzLmIoYVtkXSk7MD09Yy5sZW5ndGgmJihjPSJ6b3JrIik7cmV0dXJuIGN9O29iLnByb3RvdHlwZS5tPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXdpbmRvdzshdGhpcy5iOyl7dHJ5e2lmKGEuZnJhbWVzLl9fdGNmYXBpTG9jYXRvcnx8YS5mcmFtZXMuX19jbXBMb2NhdG9yKXRoaXMuYj1hfWNhdGNoKGMpe31pZihhPT09d2luZG93LnRvcClicmVhaztpZihhPT09YS5wYXJlbnQpYnJlYWs7YT1hLnBhcmVudH13aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jLmJpbmQodGhpcykpfTtvYi5wcm90b3R5cGUuZj1mdW5jdGlvbihhLGMsZCxlKXtpZih0aGlzLmIpe3ZhciBmPU1hdGgucmFuZG9tKCkrIiI7YT17X190Y2ZhcGlDYWxsOntjb21tYW5kOmEscGFyYW1ldGVyOmUsdmVyc2lvbjpjLGNhbGxJZDpmfX07dGhpcy5hW2ZdPWQ7dGhpcy5iLnBvc3RNZXNzYWdlKGEsIioiKX1lbHNlIGQoe21zZzoiQ01QIG5vdCBmb3VuZCJ9LCExKX07b2IucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGM9Cnt9O2lmKCJzdHJpbmciPT09dHlwZW9mIGEuZGF0YSl0cnl7Yz1KU09OLnBhcnNlKGEuZGF0YSl9Y2F0Y2goZCl7fWVsc2UgYz1hLmRhdGE7YyYmYy5fX3RjZmFwaVJldHVybiYmKGE9Yy5fX3RjZmFwaVJldHVybikmJmEuY2FsbElkJiZ0aGlzLmEmJnRoaXMuYVthLmNhbGxJZF0mJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmFbYS5jYWxsSWRdJiYodGhpcy5hW2EuY2FsbElkXShhLnJldHVyblZhbHVlLGEuc3VjY2VzcyksZGVsZXRlIHRoaXMuYVthLmNhbGxJZF0pfTtvYi5wcm90b3R5cGUubD1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYztGYyhmdW5jdGlvbihkKXtjPWEuZi5iaW5kKGEpOyFhLmImJndpbmRvdy5fX3RjZmFwaSYmKGM9d2luZG93Ll9fdGNmYXBpKTtyZXR1cm4gZC5yZXR1cm4obmV3IFByb21pc2UoZnVuY3Rpb24oZSl7YygiZ2V0VENEYXRhIiwyLGZ1bmN0aW9uKGYsaCl7aD8odGhpcy5pPWYsdGhpcy5lYz1mLnRjU3RyaW5nLHRoaXMuV2M9dGhpcy5pLmdkcHJBcHBsaWVzLAplKHRoaXMuZWMpKTplKCExKX0uYmluZChhKSl9KSl9KX07b2IucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmwoKX07Zy5VYT1uZXcgb2I7Zy5VYS5nKCk7dS5wcm90b3R5cGUuTmI9ZnVuY3Rpb24oYSl7dGhpcy5nPWF9O3UucHJvdG90eXBlLiRiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nLm1pblZpczt0aGlzLmdbdGhpcy5iYV0mJnRoaXMuZ1t0aGlzLmJhXS5taW5WaXMmJihhPXRoaXMuZ1t0aGlzLmJhXS5taW5WaXMpO3JldHVybiBhfTt1LnByb3RvdHlwZS5UZT1mdW5jdGlvbigpeyJwcmVyb2xsIj09Zy5qLlUmJmcuai50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLk8oKSwhMCk7dGhpcy5PZSgpO2cuai5hKHYudSx0aGlzLmIoKSl9O3UucHJvdG90eXBlLmVhPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT10aGlzO2cuai5NKCkmJigodGhpcy5jPWcuai5GZCl8fGcuai50cmFjaygidnJ0Y2x6cl9ub2ludGVyYWN0aW9uIiwiIiwhMCkpOyJ2ZXJ0aWNhbGl6ciI9PT0KYSYmKHRoaXMuYz0hMCk7Zy5qLmZhPW51bGw7aWYodGhpcy5pLmIpdGhpcy5nYSsrLHRoaXMuaS5MYigpLGcuai5JYigpJiZ0aGlzLmdiKCkmJnRoaXMuaGIoKT90aGlzLlRiKCk6KGcuSC5nZXRDb25maWcoKSx0aGlzLmkuSmEmJnRoaXMuaS5hPyhnLmouQWIoYSksdGhpcy5jPyh0aGlzLlU9ITAsdGhpcy5sPW5ldyBXLHRoaXMuZmEoKSk6KHRoaXMuVGUoKSx0aGlzLmw9bmV3IFcoYSksdGhpcy5sLm9uKCJjb21wbGV0ZSIsZnVuY3Rpb24oaCl7aC55Yz9lLmZhKCk6ZS5GKCl9LCEwKSx0aGlzLmwub24oImVycm9yIixmdW5jdGlvbihoKXtlLnNhKGgpO2UuRigpfSwhMCkpKTp0aGlzLkYoKSk7ZWxzZXt2YXIgZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmVhKGEsYyxkKX0sNTApfX07dS5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oKXt0aGlzLkZhPXRoaXMuaWE9dGhpcy5wYT0hMTsodGhpcy5DPXRoaXMubD90aGlzLmwuWmMoKTpudWxsKT8oIndlbGVjdCI9PT10aGlzLkEmJmcudi5iKCJhZF9mYWxsYmFjayIpJiYKZy5qLnRyYWNrKCJzdGF0c193dF9hdmFpbGFibGUiLCEwLCEwKSx0aGlzLk9iKHRoaXMuQyksdGhpcy5HYih0aGlzLkMpLHRoaXMuWT10aGlzLkZiKHRoaXMuQyksdGhpcy4kZCgpKTp0aGlzLmM/dGhpcy5PYih0aGlzLkMpOnRoaXMudWMoKX07dS5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMubC5pLGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLmZiKGNbZF0sY1tkXS5lcnJvcik7dGhpcy5DIGluc3RhbmNlb2YgamEmJih0aGlzLkMuZXJyb3I9YSYmYSBpbnN0YW5jZW9mIEM/YTpuZXcgQyhDLkYpLHRoaXMuZmIodGhpcy5DLHRoaXMuQy5lcnJvcikpfTt1LnByb3RvdHlwZS5mYj1mdW5jdGlvbihhLGMpe3N3aXRjaChjLnR5cGUpe2Nhc2UgQy5nOmMuZGV0YWlscz09Qy5hLlRkP2cuai5hKHYuZ2EsdGhpcy5iKCkpOihnLmoubWEoKSxjLmRldGFpbHM9PUMuYS5RZC5jb2RlJiZnLmouYSh2LlUsdGhpcy5iKCkpKTtnLmouYSh2Lk8sdGhpcy5iKCkpO3RoaXMuUGUoKTsKdGhpcy5vKCJlbXB0eSIpOyJ3ZWxlY3QiPT09dGhpcy5BJiZnLnYuYigiYWRfZmFsbGJhY2siKSYmZy5qLnRyYWNrKCJzdGF0c193dF9hdmFpbGFibGUiLCExLCEwKTt0aGlzLmkuUyYmZy5qLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuaS5TLCEwKTticmVhaztjYXNlIEMuYjpnLmouYSh2LmRhLHRoaXMuYigpKTt0aGlzLm8oInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSBDLkI6Zy5qLmEodi5oYSx0aGlzLmIoKSk7dGhpcy5vKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIEMubzpnLmouYSh2LmlhLHRoaXMuYigpKTt0aGlzLm8oInhtbHBhcnNlIik7YnJlYWs7Y2FzZSBDLmk6Zy5qLmEodi5pLHRoaXMuYigpKTt0aGlzLm8oIm5vbWVkaWEiKTticmVhaztjYXNlIEMubTpnLmouYSh2LmksdGhpcy5iKCkpO3RoaXMubygibWVkaWFlcnJvciIpO2JyZWFrO2Nhc2UgQy5mOmcuai5hKHYuYmEsdGhpcy5iKCkpO3RoaXMubygiZHVtbXlhZCIpO2JyZWFrOwpjYXNlIEMubDpnLmouYSh2LlosdGhpcy5iKCkpO3RoaXMubygiZHVyYXRpb24iKTticmVhaztjYXNlIEMuYzpnLmouYSh2LmksdGhpcy5iKCkpO2MmJmMuZGF0YSYmYy5kYXRhLmRldGFpbHMmJmMuZGF0YS5kZXRhaWxzLmNvZGU9PUMuYS5uZC5jb2RlP3RoaXMubygiT05MWV9NRVpaQU5JTkUiKTp0aGlzLm8oIk5PX1BMQVlBQkxFX0FEUyIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5vKCJ1bmtub3duIil9YSYmYS5qYSYmdGhpcy52ZShhLGEuZXJyb3IudHlwZS5jb2RlKX07dS5wcm90b3R5cGUudmU9ZnVuY3Rpb24oYSxjKXthPWEuamEuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiJlcnJvciI9PT1lLmlkfSk7aWYoOTAxPGN8fDE+YyljPTkwMDtmb3IoYz17IltFUlJPUkNPREVdIjpjfTthLmxlbmd0aDspdHJ5e3ZhciBkPWEucG9wKCk7dGhpcy5kYShkLnVybCxkLnR5cGUsYyl9Y2F0Y2goZSl7fX07dS5wcm90b3R5cGUuR2I9ZnVuY3Rpb24oYSl7aWYoYSl7YS5vcmlnaW4mJihhPWEub3JpZ2luKTsKaWYoYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgdSl0cnl7dGhpcy5oYT10aGlzLnplKGEpfWNhdGNoKGMpe310aGlzLkdiKGEucGFyZW50KX19O3UucHJvdG90eXBlLkZiPWZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgdXx8KGM9dGhpcy5GYihhLnBhcmVudCkpLGMucHVzaCh0aGlzLndlKGEpKSk7cmV0dXJuIGN9O3UucHJvdG90eXBlLndlPWZ1bmN0aW9uKGEpe3ZhciBjPSIiLGQ9W107aWYoYSYmYS5SYSYmYS5SYS5nZXRBdHRyaWJ1dGUpe2M9YS5SYS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQucHVzaChhW2VdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmMsY3JlYXRpdmVJRDpkfX07dS5wcm90b3R5cGUuemU9CmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9W10sZT0iIjtpZihhLlJhKXt2YXIgZj1hLlJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7dmFyIGg9YS5SYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlJhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGU9YS5SYS5nZXRBdHRyaWJ1dGUoImlkIiksZC5wdXNoKGUpKTthLlJhLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZT1hLlJhLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGQucHVzaChlKSk7Zm9yKHZhciBtPTA7bTxoLmxlbmd0aDttKyspaFttXS5nZXRBdHRyaWJ1dGUoImlkIikmJihlPWhbbV0uZ2V0QXR0cmlidXRlKCJpZCIpLGQucHVzaChlKSksaFttXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGU9aFttXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxkLnB1c2goZSkpO2ZvcihtPTA7bTxmLmxlbmd0aDttKyspYy5wdXNoKGEuQmQoZlttXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmQsYWRJZDplfX07dS5wcm90b3R5cGUuU2E9CmZ1bmN0aW9uKCl7dGhpcy5NPSExfTt1LnByb3RvdHlwZS5NYz1mdW5jdGlvbigpe3RoaXMucy5yZW1vdmVDaGlsZCh0aGlzLmYpO3RoaXMubT10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5XPSExO3RoaXMuS2IodGhpcy5kaXNwbGF5KTt0aGlzLmRpc3BsYXkucmVtb3ZlKCl9O3UucHJvdG90eXBlLk9iPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuYS5ZYygpLGQ9Zy52LmIoImNvbnRhaW5lci5zdHlsZSIpLGU9cGFyc2VJbnQoZy52LmIoInpJbmRleCIpfHwxRTQsMTApOy0tZTtkJiZnLmoucWEoYyxkKyIiKTtjLnpJbmRleD1lO3RoaXMucz1jO2cudi5iKCJza2lwT2Zmc2V0IikmJiF0aGlzLkMuWGImJih0aGlzLkMuWGI9Zy52LmIoInNraXBPZmZzZXQiKSk7dGhpcy5kaXNwbGF5PW51bGw7dGhpcy5kaXNwbGF5PXRoaXMuZWUoYSk7dGhpcy5kaXNwbGF5LkNlKGEpO3RoaXMuZGlzcGxheS5qZCh0aGlzLmEpO3RoaXMuZGlzcGxheS5FZSh0aGlzLlMoKSk7dGhpcy5kaXNwbGF5LkZlKGMpOwp0aGlzLlJjJiZ0aGlzLnBsYXllci5YYygpJiZ0aGlzLmRpc3BsYXkuR2UodGhpcy5wbGF5ZXIuWGMoKS8xMDApO3RoaXMuUWModGhpcy5kaXNwbGF5KTt0aGlzLmRpc3BsYXkuVigpPyh0aGlzLkxlKHRoaXMuTygpKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGcudi5iKCJpbm5lcldhcnBwZXIuc3R5bGUiKT9hLnN0eWxlPWcudi5iKCJpbm5lcldhcnBwZXIuc3R5bGUiKSsiIjooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIix0aGlzLmMmJihhLnN0eWxlLnRvcD0iOHB4IixhLnN0eWxlLmxlZnQ9IjhweCIsYS5zdHlsZS53aWR0aD0iY2FsYygxMDAlIC0gMTZweCkiLGEuc3R5bGUuaGVpZ2h0PSJjYWxjKDEwMCUgLSAxNnB4KSIsYS5zdHlsZS5ib3JkZXI9IjFweCBzb2xpZCB3aGl0ZSIpKSx0aGlzLmY9dGhpcy5zLmFwcGVuZENoaWxkKGEpLHRoaXMuYyYmdGhpcy5kaXNwbGF5IGluc3RhbmNlb2YKUiYmdGhpcy5hLlZjKCEwKSx0aGlzLmRpc3BsYXkuc2IodGhpcy5mKSk6dGhpcy5LYih0aGlzLmRpc3BsYXkpfTt1LnByb3RvdHlwZS5qZD1mdW5jdGlvbihhKXt0aGlzLmE9YX07dS5wcm90b3R5cGUuZWU9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkPW51bGwsZT1udWxsLGY9bnVsbDtpZihhJiZhLnUoKSl7dHJ5eyhlPXRoaXMuYS5ULmdldFJhd1BsYXllcigpKSYmZS5lbnZ2YXJzJiYoZj1lLmVudnZhcnMoKSk7Zi52aWRlb1Nsb3R8fChlPXRoaXMuYS5UKSYmZS53YyYmKGY9ZS53YygpKTtpZihmLnZpZGVvU2xvdClyZXR1cm4gZD1uZXcgT2EsZC5zKGYudmlkZW9TbG90KSxkO3Rocm93InZpZGVvVGFnIjt9Y2F0Y2goaCl7ZD1uZXcgTH1nLnFjP2Q9bmV3IG9hOmQ9bmV3IEx9ZWxzZSBhJiZhLmYoKT8odGhpcy5HYT0hMCxkPW5ldyBWKTp0aGlzLmMmJihnLkNjPyhkPWcuQ2MsZC5jb250aW51ZSgpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRWIuYmluZCh0aGlzKSwwKSk6ZD1uZXcgUiwKdGhpcy5DPW5ldyBqYShbXSxbXSxbXSxudWxsKSx0aGlzLkMuWGI9NSx0aGlzLmEuZyhmdW5jdGlvbihoKXtjLmRpc3BsYXkucmVzaXplKGgpfSkpO3JldHVybiBkfTt1LnByb3RvdHlwZS5RYz1mdW5jdGlvbihhKXt2YXIgYz10aGlzO2Eub24oYS5ldmVudC5ZYix0aGlzLkViLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5wYyx0aGlzLnRlLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5HYyx0aGlzLkJiLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5LYyx0aGlzLmxiLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5FYyx0aGlzLnpiLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5GYyx0aGlzLkFiLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5IYyx0aGlzLkNiLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5MYyx0aGlzLm5iLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5wZCx0aGlzLnJlLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5xZCx0aGlzLm9iLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5tYywKdGhpcy55Yi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuT2EsdGhpcy5mZS5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuUGEsdGhpcy5xZS5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuSWMsdGhpcy5uYS5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQub2QsdGhpcy5vYS5iaW5kKHRoaXMpKTt0aGlzLmMmJihhLm9uKCJjbG9zZSIsZnVuY3Rpb24oKXtjLmtjKCk7Yy5hLlZjKCExKTtjLmYuc3R5bGUudG9wPSIwIjtjLmYuc3R5bGUubGVmdD0iMCI7Yy5mLnN0eWxlLndpZHRoPSIxMDAlIjtjLmYuc3R5bGUuaGVpZ2h0PSIxMDAlIjtjLmYuc3R5bGUuYm9yZGVyPSJub25lIn0pLGEub24oInVuY2xvc2UiLGZ1bmN0aW9uKCl7Yy5hLlZjKCEwKTtjLmYuc3R5bGUudG9wPSI4cHgiO2MuZi5zdHlsZS5sZWZ0PSI4cHgiO2MuZi5zdHlsZS53aWR0aD0iY2FsYygxMDAlIC0gMTZweCkiO2MuZi5zdHlsZS5oZWlnaHQ9ImNhbGMoMTAwJSAtIDE2cHgpIjtjLmYuc3R5bGUuYm9yZGVyPSIxcHggc29saWQgd2hpdGUifSksCmEub24oIlNIT1dDT05UUk9MUyIsZnVuY3Rpb24oKXt0aGlzLkcoKTt0aGlzLkQoKX0uYmluZCh0aGlzKSkpfTt1LnByb3RvdHlwZS5LYj1mdW5jdGlvbihhKXthLmcoYS5ldmVudC5ZYik7YS5nKGEuZXZlbnQucGMpO2EuZyhhLmV2ZW50LkdjKTthLmcoYS5ldmVudC5LYyk7YS5nKGEuZXZlbnQuRWMpO2EuZyhhLmV2ZW50LkZjKTthLmcoYS5ldmVudC5IYyk7YS5nKGEuZXZlbnQuTGMpO2EuZyhhLmV2ZW50Lk9hKTthLmcoYS5ldmVudC5QYSl9O3UucHJvdG90eXBlLkViPWZ1bmN0aW9uKCl7dGhpcy5QYygpO3RoaXMuYS5NKCk7dGhpcy5kaXNwbGF5IGluc3RhbmNlb2YgVnx8dGhpcy5MZCgpO3RoaXMuTWQoKTt0aGlzLmpiKCk7dGhpcy5hLkQoKTt0aGlzLkJlKCk7dGhpcy5jJiZ0aGlzLnUoKX07dS5wcm90b3R5cGUudGU9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5hLlQ7YT1hLmN1cnJlbnRUaW1lO3RoaXMuVmI9ITA7Yy5IYSYmYy5IYSgpJiZnLmouYSh2LmIsdGhpcy5iKCkpO2M9TWF0aC5mbG9vcihhKTsKdGhpcy5JZChjKTtpZighdGhpcy5pYSl7YT0yRTM7dmFyIGQ9NTAsZT1nLnYuYigidmlld2FibGVJbXByZXNzaW9uIik7ZSYmKGUucGVyY2VudCYmKGQ9ZS5wZXJjZW50KSxlLnRpbWVNUyYmKGE9ZS50aW1lTVMpKTt0aGlzLmlhPXtkaXNwbGF5OnRoaXMuZGlzcGxheSxjYjpmdW5jdGlvbigpe3RoaXMuRmE9ITA7Zy5qLmEodi5lYSx0aGlzLmIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YSxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtnLmouR2EodGhpcy5pYSl9YT0iIjt0aGlzLkMuWGImJihkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKSYmKGM9dGhpcy5DLlhiLWMsMDxjP2E9Zy52LmIoInNraXBhYmxlQnV0dG9uIik6KGE9Zy52LmIoInNraXBCdXR0b24iKSx0aGlzLld8fCh0aGlzLlc9ITAsZy5qLnRyYWNrKCJ2cnRjbHpyX3NraXBfYWN0aXZlIiwiIiwhMCksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmRpc3BsYXkuZWEoKTsKdGhpcy50cmFjaygic2tpcCIpO2cuai5hKHYuYyx0aGlzLmIoKSk7dGhpcy5DLnRkPyh0aGlzLk1jKCksdGhpcy5DLm9yaWdpbi50ZigpKTp0aGlzLkYoKX0uYmluZCh0aGlzKSkpKSx0aGlzLmRpc3BsYXkuRyhhKSYmKGE9dGhpcy5kaXNwbGF5LkcoYSkpLGE9YS5yZXBsYWNlKCJbdGltZV0iLGMpLGQuaW5uZXJIVE1MPWEpO3RoaXMubSYmKGM9dGhpcy5kaXNwbGF5LmdldER1cmF0aW9uKCksYT10aGlzLmRpc3BsYXkuZ2V0Q3VycmVudFRpbWUoKSx0aGlzLm0uaW5uZXJIVE1MPXRoaXMuWi5yZXBsYWNlKCJbdGltZV0iLGcuai53YShjLWEpKSx0aGlzLmMmJnRoaXMudSgpKX07dS5wcm90b3R5cGUuemI9ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX07dS5wcm90b3R5cGUuQmI9ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5QfHx0aGlzLlFlKCk7Zy5qLmEodi5tLHRoaXMuYigpKX07dS5wcm90b3R5cGUubGI9ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNiKCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TYigpfS5iaW5kKHRoaXMpKTt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuaS5vJiZ0aGlzLmNhKCJzdGFydCIpO2cuai5hKHYuQSx0aGlzLmIoKSk7dGhpcy5jJiZ0aGlzLkQoKX07dS5wcm90b3R5cGUuQWI9ZnVuY3Rpb24oKXt0aGlzLmkubyYmKGcuai50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5jYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMucGE9ITApO3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTtnLmouYSh2LmwsdGhpcy5iKCkpfTt1LnByb3RvdHlwZS5DYj1mdW5jdGlvbigpe3RoaXMuaS5vJiYoZy5qLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5jYSgibWlkcG9pbnQiKSk7dGhpcy50cmFjaygibWlkcG9pbnQiKTtnLmouYSh2LkYsdGhpcy5iKCkpfTt1LnByb3RvdHlwZS5uYj0KZnVuY3Rpb24oKXt0aGlzLmkubyYmKGcuai50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5jYSgidGhpcmRRdWFydGlsZSIpKTt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zy5qLmEodi5ELHRoaXMuYigpKX07dS5wcm90b3R5cGUucmU9ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zy5qLmEodi5jLHRoaXMuYigpKX07dS5wcm90b3R5cGUub2I9ZnVuY3Rpb24oKXtnLmouYSh2LkcsdGhpcy5iKCkpO3RoaXMuZGlzcGxheSYmdGhpcy5kaXNwbGF5LmdldEN1cnJlbnRUaW1lJiZ0aGlzLmRpc3BsYXkuZ2V0RHVyYXRpb24mJnRoaXMuSmQodGhpcy5kaXNwbGF5LmdldEN1cnJlbnRUaW1lKCksdGhpcy5kaXNwbGF5LmdldER1cmF0aW9uKCkpfTt1LnByb3RvdHlwZS5uYT1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuemEpO2EmJihhLmlubmVySFRNTD10aGlzLmcucGxheUJ1dHRvbik7dGhpcy5CJiYodGhpcy5CLnN0eWxlLmRpc3BsYXk9CiJibG9jayIsdGhpcy5LKCksdGhpcy51KCkpO3RoaXMudHJhY2soInBhdXNlIiwhMCk7Zy5qLmEodi5CLHRoaXMuYigpKX07dS5wcm90b3R5cGUub2E9ZnVuY3Rpb24oKXsid2VsZWN0Ij09PXRoaXMuQSYmKHRoaXMuVT0hMSx0aGlzLkcoKSk7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy56YSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuZy5wYXVzZUJ1dHRvbik7dGhpcy5CJiYodGhpcy5CLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtnLmouYSh2LnMsdGhpcy5iKCkpO3RoaXMuYyYmdGhpcy5EKCl9O3UucHJvdG90eXBlLkRiPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy50YSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuZy51bm11dGVCdXR0b24pO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlFiKCJtdXRlZCIpO2cuai5hKHYuWGEsdGhpcy5iKCkpfTt1LnByb3RvdHlwZS5wYj1mdW5jdGlvbigpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnRhKTthJiYoYS5pbm5lckhUTUw9dGhpcy5nLm11dGVCdXR0b24pO3RoaXMudHJhY2soInVubXV0ZSIsITApO3RoaXMuUWIoInVubXV0ZWQiKTtnLmouYSh2LiRhLHRoaXMuYigpKX07dS5wcm90b3R5cGUueWI9ZnVuY3Rpb24oYSl7dGhpcy5hLlQmJnRoaXMuYS5ULnpkJiZ0aGlzLmEuVC56ZCgpO2lmKGcuai5yYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5jJiYodGhpcy5VPSExKSx0aGlzLkcoKTtlbHNlIGlmKGF8fHRoaXMuQy5VYil7dHJ5e3ZhciBjPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuQy50Y3x8KHRoaXMuQy50Yz0xKTtpZigxMDA+Yy10aGlzLkMudGMpcmV0dXJuO3RoaXMuQy50Yz1jfWNhdGNoKGQpe31nLmouYSh2Lk0sdGhpcy5iKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTthPSJfdG9wIjtpZih0aGlzLmkuZGF8fCJ3ZWxlY3QiPT09dGhpcy5BKWE9Il9ibGFuayI7CndpbmRvdy5vcGVuKHRoaXMuQy5VYixhKX19O3UucHJvdG90eXBlLmZlPWZ1bmN0aW9uKCl7aWYodGhpcy5DKWcuSC5vJiYhdGhpcy5QJiYoZy5qLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5jYSgiY29tcGxldGUiKSksdGhpcy50cmFjaygiY29tcGxldGUiKSxnLmouYSh2LmYsdGhpcy5iKCkpLHRoaXMuRigpO2Vsc2UgaWYodGhpcy5jKXt0aGlzLk09ITE7dGhpcy5nYSsrO3RyeXt0aGlzLmRpc3BsYXkucmVtb3ZlKCl9Y2F0Y2goYSl7fXRyeXt0aGlzLnMucmVtb3ZlQ2hpbGQodGhpcy5mKX1jYXRjaChhKXt9dGhpcy5tPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLlc9ITE7dGhpcy5kaXNwbGF5LnBhdXNlKCk7dGhpcy5hLmMoKTt0aGlzLlZiPSExO3RoaXMuUygpLmZkKCk7dGhpcy5tYSgpfX07dS5wcm90b3R5cGUucWU9ZnVuY3Rpb24oYSl7YSBpbnN0YW5jZW9mIEM/KHRoaXMuc2EoYSksdGhpcy5GKCEwKSk6KCJ2cGFpZGVycm9yIj09YSYmKHRoaXMubygidnBhaWRlcnJvciIpLApnLmouYSh2LmZhLHRoaXMuYigpKSx0aGlzLkYoKSksInZlcnRpY2FsaXpyIj09YSYmdGhpcy5GKCksIk5PT1BWSURFTyI9PWEmJih0aGlzLlA9ITAsdGhpcy5GKCkpLGE9PUMuaSYmdGhpcy5zYShDLmkpLCJwbGF5cHJvbWlzZUZhaWxlZCIhPWF8fHRoaXMubGF8fHRoaXMuRigpKX07dS5wcm90b3R5cGUuQmU9ZnVuY3Rpb24oKXt0aGlzLmxhfHx0aGlzLk5jKCl9O3UucHJvdG90eXBlLk5jPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LnBsYXkoKTt0aGlzLlMoKS5rZCh0aGlzKX07dS5wcm90b3R5cGUuT2M9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPVtdLGQsZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9Zy5qLmlhKGFbZV0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT12LmEoYSx0aGlzLnFhKCkpO2cuai4kYihhKX07dS5wcm90b3R5cGUuRj1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTt0aGlzLkMmJnRoaXMuQy5HZCYmdGhpcy5PYyh0aGlzLkMuR2QpO2lmKCF0aGlzLk0paWYodGhpcy5NPQohMCx0aGlzLkZhfHwoZy5qLmEodi5XLHRoaXMuYigpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSwhdGhpcy5sfHx0aGlzLmwuY3x8dGhpcy5sLmx8fHRoaXMubC5BKXt0aGlzLk09ITE7dGhpcy5nYSsrO3RyeXt0aGlzLmRpc3BsYXkucmVtb3ZlKCl9Y2F0Y2goYyl7fXRyeXt0aGlzLnMucmVtb3ZlQ2hpbGQodGhpcy5mKX1jYXRjaChjKXt9dGhpcy5tPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLlc9ITE7dHJ5e3RoaXMuZGlzcGxheS5wYXVzZSgpfWNhdGNoKGMpe310aGlzLmEuYygpO3RoaXMuVmI9ITE7dGhpcy5TKCkuZmQoKTtpZih0aGlzLmwmJnRoaXMubC55YyYmdGhpcy5sLmMpdGhpcy5mYSgpO2Vsc2V7aWYodGhpcy5sJiZ0aGlzLmwubCYmYSl7aWYodGhpcy5sLnljKXt0aGlzLmZhKCk7cmV0dXJufWlmKHRoaXMubC5BKXt0aGlzLmwuVSgpO3JldHVybn19dGhpcy51YygpfX1lbHNlIHRoaXMudWMoKX07dS5wcm90b3R5cGUuYj1mdW5jdGlvbigpe3RyeXt2YXIgYT1PYmplY3QuYXNzaWduKHt9LAp0aGlzLkMmJnRoaXMuQy5jZT90aGlzLkMub2M6bnVsbCx0aGlzLmEuVC5DYSgpLHRoaXMucWIoKSx0aGlzLnFhKCkpfWNhdGNoKGMpe2E9e319cmV0dXJuIGF9O3UucHJvdG90eXBlLlNiPWZ1bmN0aW9uKCl7dGhpcy5KYnx8KHRoaXMuSmI9ITAsdGhpcy5wYXx8Zy5qLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX07dS5wcm90b3R5cGUuSWQ9ZnVuY3Rpb24oYSl7dGhpcy5vYigpO2E9PXRoaXMuS2F8fHRoaXMuUHx8KDA9PWEmJih0aGlzLkJiKCksdGhpcy56YigpLHRoaXMubGIoKSksYT09TWF0aC5mbG9vcih0aGlzLkMuZHVyYXRpb24vNCkmJnRoaXMuQWIoKSxhPT1NYXRoLmZsb29yKHRoaXMuQy5kdXJhdGlvbi8yKSYmdGhpcy5DYigpLGE9PU1hdGguZmxvb3IoMyp0aGlzLkMuZHVyYXRpb24vNCkmJnRoaXMubmIoKSx0aGlzLkthPWEpfTt1LnByb3RvdHlwZS5MZT1mdW5jdGlvbihhKXtnLmoudHJhY2soInN0YXRzX2hkX2FkX3NldHVwIiwKYSwhMCl9O3UucHJvdG90eXBlLk9lPWZ1bmN0aW9uKCl7Zy5qLlkoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5PKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfTt1LnByb3RvdHlwZS5RZT1mdW5jdGlvbigpe2cuai5ZKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuTygpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX07dS5wcm90b3R5cGUuUGU9ZnVuY3Rpb24oKXtnLmouWShbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5PKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX07dS5wcm90b3R5cGUubz1mdW5jdGlvbihhKXtnLmouWShbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfTt1LnByb3RvdHlwZS5jYT1mdW5jdGlvbihhKXsodGhpcy5HYXx8dGhpcy5pLm8pJiZnLmoudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLk8oKSwhMCl9O3UucHJvdG90eXBlLlFiPWZ1bmN0aW9uKGEpe3RoaXMuaS5vJiYKZy5qLnRyYWNrKCJzdGF0c19oZF8iK2EsImNvbnRlbnQiLCEwKX07dS5wcm90b3R5cGUuSmQ9ZnVuY3Rpb24oYSxjKXthPU1hdGguZmxvb3IoYSk7aWYoIXRoaXMuRGFbIl8iK2FdKXt2YXIgZD10aGlzLldhKHRoaXMuQy5qYSwicHJvZ3Jlc3MiKTt0aGlzLkRhWyJfIithXT1bXTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9ZFtlXTthPT1nLmouZ2IoZi5vZmZzZXQsYykmJih0aGlzLmRhKGYudXJsLCJwcm9ncmVzcyIpLHRoaXMuRGFbIl8iK2FdLnB1c2goZikpfX19O3UucHJvdG90eXBlLnRyYWNrPWZ1bmN0aW9uKGEsYyl7Yz12b2lkIDA9PT1jPyExOmM7aWYoInByb2dyZXNzIiE9YSYmIXRoaXMuUCl7dGhpcy53YSYmdGhpcy53YS50cmFjayYmdGhpcy53YS50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJm51bGwhPWcuai5mYSYmZy5qLnRyYWNrKCJzdGF0c19oZF9hZHhfaW1wcmVzc2lvbiIsZy5qLmZhLnRvU3RyaW5nKCksITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PQphfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7dmFyIGQ9YSsiSGFzQmVlblRyYWNrZWQiO2lmKHRoaXNbZF0pcmV0dXJuO3RoaXNbZF09ITB9ZD1bXTt0cnl7ZD10aGlzLldhKHRoaXMuQy5qYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgZT1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMua2E9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5oYS5pbXByZXNzaW9ucyYmZy5qLkpiKGUudXJsLHRoaXMuaGEuaW1wcmVzc2lvbnMpP3RoaXMuZGEoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGYpe3RyeXt2YXIgaD1mLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2cuai5hKHYubyx0aGlzLkMub2MsdGhpcy5hLlQuQ2EoKSx0aGlzLnFiKCkse2FkSWQ6dGhpcy5oYS5hZElkLGltcHJlc3Npb25VUkw6aH0sdGhpcy5xYSgpKX1jYXRjaChtKXt9fS5iaW5kKHRoaXMpKTp0aGlzLmRhKGUudXJsLGUudHlwZSl9Y2F0Y2goZil7fWlmKCFjKXRyeXt0aGlzLkMuamE9CnRoaXMuWmIodGhpcy5DLmphLGEpfWNhdGNoKGYpe319fTt1LnByb3RvdHlwZS5PPWZ1bmN0aW9uKCl7dmFyIGE9Zy5qLnJhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGM9IiI7Zy5qLnUmJihjPSJfcmVjeWNsZWQiKTt0aGlzLkdhJiYoYz0iX3ZwYWlkIik7IndlbGVjdCI9PT10aGlzLkEmJihjPSJfd2VsZWN0Iik7cmV0dXJuIGErY307dS5wcm90b3R5cGUuZGE9ZnVuY3Rpb24oYSxjLGQsZSl7ZD12b2lkIDA9PT1kP3t9OmQ7ZT12b2lkIDA9PT1lP251bGw6ZTt2YXIgZj12b2lkIDA9PT1mP251bGw6ZjtpZihhJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoKXt2YXIgaD10aGlzLmkuYyhhKTtkJiZoLmIoZCk7ZXx8KGU9dGhpcy54Yik7Znx8KGY9dGhpcy54Yik7ZD1mdW5jdGlvbigpe3RoaXMuTGIoYSk7ZSgpfS5iaW5kKHRoaXMpO3ZhciBtPWZ1bmN0aW9uKCl7dGhpcy5MYihhKTtmKCl9LmJpbmQodGhpcyk7Zy5qLmJhPygiaW1wcmVzc2lvbiIhPWN8fHRoaXMuaWJ8fCh0aGlzLmliPQohMCxjPWcuai5OKCJodHRwczovL2hvbWFkLXZhc3QtaW1wcmVzc2lvbnMuczMuYW1hem9uYXdzLmNvbS93ZWxlY3QuZGUuZ2lmP3NhbHQ9MC4iK2cuai5zKDE2KSxnLkgpLGM9dGhpcy5pLmMoYyksdGhpcy5pLmwoYyxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LCExLCEwKSksKG5ldyBJbWFnZSkuc3JjPWEpOih0aGlzLkRjKGEpLHRoaXMuaS5sKGgsZCxtLCExLCEwKSl9fTt1LnByb3RvdHlwZS5EYz1mdW5jdGlvbihhKXt0aGlzLk5bYV09Im9wZW4ifTt1LnByb3RvdHlwZS5MYj1mdW5jdGlvbihhKXt0aGlzLk5bYV09ImNsb3NlZCJ9O3UucHJvdG90eXBlLiRkPWZ1bmN0aW9uKCl7dGhpcy5OPXt9fTt1LnByb3RvdHlwZS5SZT1mdW5jdGlvbigpe3ZhciBhPTAsYztmb3IoYyBpbiB0aGlzLk4pdGhpcy5OLmhhc093blByb3BlcnR5KGMpJiYib3BlbiI9PXRoaXMuTltjXSYmYSsrO3JldHVybiBhfTt1LnByb3RvdHlwZS5XYT1mdW5jdGlvbihhLGMpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gZC50eXBlPT0KY30pfTt1LnByb3RvdHlwZS5aYj1mdW5jdGlvbihhLGMpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gZC50eXBlIT09Y30pfTt1LnByb3RvdHlwZS5QYz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5UO2EudWQmJmEudWQodGhpcy55Yi5iaW5kKHRoaXMpKX07dS5wcm90b3R5cGUuTGQ9ZnVuY3Rpb24oKXtpZighdGhpcy5tKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmdbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuZ1siY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO3RoaXMuYz9hLmlubmVySFRNTD0iV2VyYnVuZyI6YS5pbm5lckhUTUw9dGhpcy5aLnJlcGxhY2UoIlt0aW1lXSIsZy5qLndhKDApKTt2YXIgYz10aGlzLmdbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLmkuVyYmKGM9dGhpcy5pLlcpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMudS5iaW5kKHRoaXMpLDFFMypjKTt0aGlzLm09dGhpcy5mLmFwcGVuZENoaWxkKGEpO3RoaXMuYyYmKHRoaXMubS5zdHlsZS50cmFuc2Zvcm1PcmlnaW49ImJvdHRvbSBjZW50ZXIiLHRoaXMubS5zdHlsZS50cmFuc2Zvcm09InNjYWxlKDEuNSkiLHRoaXMudSgpKX19O3UucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXsodGhpcy5nWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuaS5XfHx0aGlzLmMpJiZ0aGlzLm0mJnRoaXMubS5zdHlsZSYmCih0aGlzLm0uc3R5bGUuZGlzcGxheT0ibm9uZSIpfTt1LnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaXNwbGF5LmdldER1cmF0aW9uKCksYz10aGlzLmRpc3BsYXkuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRpc3BsYXkubCgpfHxhJiZjJiYodGhpcy5nWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuaS5XfHx0aGlzLmMpJiZ0aGlzLm0mJnRoaXMubS5zdHlsZSYmKHRoaXMubS5zdHlsZS5kaXNwbGF5PSJibG9jayIpfTt1LnByb3RvdHlwZS5NZD1mdW5jdGlvbigpe2lmKCFnLmouY2EodGhpcy5jb250cm9scykpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLmJlO3RoaXMuZ1siY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuZ1siY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0KIkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkcoKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLksoKTt0aGlzLnUoKX0uYmluZCh0aGlzKSk7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5nWyJwbGF5UGF1c2Uuc3R5bGUiXT9kLnN0eWxlPXRoaXMuZ1sicGxheVBhdXNlLnN0eWxlIl06KGQuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZC5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtkLmlkPXRoaXMuemE7ZC5pbm5lckhUTUw9dGhpcy5nLnBhdXNlQnV0dG9uOwpkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlJiLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUmIuYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5HKCk7dGhpcy5EKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LKCk7dGhpcy51KCl9LmJpbmQodGhpcykpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuZ1sibXV0ZS5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5nWyJtdXRlLnN0eWxlIl06KGUuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGUuc3R5bGVbImZsb2F0Il09InJpZ2h0IixlLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2UuaWQ9dGhpcy50YTtlLmlubmVySFRNTD10aGlzLmcubXV0ZUJ1dHRvbjtlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5TZS5iaW5kKHRoaXMpKTtlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkcoKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLksoKTt0aGlzLnUoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5nWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmdbInNraXAuc3R5bGUiXTp0aGlzLmRpc3BsYXkuSygpP2cuai5xYShmLHRoaXMuZGlzcGxheS5LKCkpOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5QYjtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgaD0KZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7aCYmaFswXSYmKGhbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGg9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7aCYmaFswXSYmKGhbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGQpO3RoaXMuQy5YYiYmYy5hcHBlbmRDaGlsZChmKTtjLmFwcGVuZENoaWxkKGUpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5qLnJhKCl8fCh0aGlzLmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuRygpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKSx0aGlzLmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LKCk7dGhpcy51KCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZi5hcHBlbmRDaGlsZChjKTt0aGlzLmdbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT8KYS5zdHlsZT10aGlzLmdbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuekluZGV4PSIxMDAwMCIsYS5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQiYmKHRoaXMuQi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmEuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CPXRoaXMuZi5hcHBlbmRDaGlsZChhKTt0aGlzLmEuZyhmdW5jdGlvbihoKXt0aGlzLkIuc3R5bGUuaGVpZ2h0PWguaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpO3RoaXMuYyYmKGQuc3R5bGUudHJhbnNmb3JtT3JpZ2luPSJib3R0b20gbGVmdCIsZC5zdHlsZS50cmFuc2Zvcm09InNjYWxlKDEuNSkiLGUuc3R5bGUudHJhbnNmb3JtT3JpZ2luPSJib3R0b20gcmlnaHQiLGUuc3R5bGUudHJhbnNmb3JtPSJzY2FsZSgxLjUpIik7dGhpcy5hLlQuRWEmJiF0aGlzLmMmJnRoaXMuYS5ULkVhKCkmJihnLmouYSh2LkssdGhpcy5iKCkpLHRoaXMuSWIoKSk7dGhpcy5LKCl9fTt1LnByb3RvdHlwZS5LPWZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn07dS5wcm90b3R5cGUuRz1mdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMuQiYmImJsb2NrIj09dGhpcy5CLnN0eWxlLmRpc3BsYXl8fAp0aGlzLlV8fHRoaXMuZGlzcGxheS5sKCl8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9O3UucHJvdG90eXBlLlJiPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmlzUGF1c2VkKCk/KHRoaXMuZGlzcGxheS5wbGF5KCksdGhpcy5vYSgpKToodGhpcy5kaXNwbGF5LnBhdXNlKCksdGhpcy5uYSgpKX07dS5wcm90b3R5cGUua2M9ZnVuY3Rpb24oKXtpZighdGhpcy5kaXNwbGF5LmlzUGF1c2VkKCl8fHRoaXMuYyl0aGlzLmRpc3BsYXkucGF1c2UoKSx0aGlzLm5hKCl9O3UucHJvdG90eXBlLk1iPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmlzUGF1c2VkKCkmJih0aGlzLmRpc3BsYXkucGxheSgpLHRoaXMub2EoKSl9O3UucHJvdG90eXBlLlNlPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmViKCk/KHRoaXMuZGlzcGxheS4kYSgpLHRoaXMucGIoKSk6KHRoaXMuZGlzcGxheS5YYSgpLHRoaXMuRGIoKSl9O3UucHJvdG90eXBlLkliPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmViKCl8fAoodGhpcy5kaXNwbGF5LlhhKCksdGhpcy5EYigpKX07dS5wcm90b3R5cGUuS2Q9ZnVuY3Rpb24oKXt0aGlzLmRpc3BsYXkuZWIoKSYmKHRoaXMuZGlzcGxheS4kYSgpLHRoaXMucGIoKSl9O3UucHJvdG90eXBlLnVjPWZ1bmN0aW9uKCl7aWYodGhpcy5nYigpKWlmKHRoaXMuaGIoKSl7aWYoZy5qLnRyYWNrKCJzdGF0c19oZF9iYWNrZmlsbF9hbGxvd2VkIiwid2VsZWN0IiwhMCksdGhpcy5UYigpKXt0aGlzLk09ITE7cmV0dXJufX1lbHNlIHRoaXMuV2QoKT9nLmoudHJhY2soInN0YXRzX2hkX2JhY2tmaWxsX2FsbG93ZWQiLCJ2ZXJ0aWNhbGl6ciIsITApOmcuai50cmFjaygic3RhdHNfaGRfYmFja2ZpbGxfYWxsb3dlZCIsIm5vbmUiLCEwKTtlbHNlIGcuai50cmFjaygic3RhdHNfaGRfYmFja2ZpbGxfYWxsb3dlZCIsImZhbHNlIiwhMCk7dGhpcy5sYT0hMDt0aGlzLm1hKCl9O3UucHJvdG90eXBlLmdiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5pLkd8fGcuai5HYigpLGM9KCF0aGlzLmthfHwKdGhpcy5BZSgpKSYmIXRoaXMuQSxkPWcuai5GYigpLGU9InByZXJvbGwiPT09Zy5qLlU7cmV0dXJuIGEmJmMmJmQmJmV9O3UucHJvdG90eXBlLmhiPWZ1bmN0aW9uKCl7dmFyIGE9Zy52LmIoImFkX2ZhbGxiYWNrIik7YT1nLkguaWEmJmEmJmEudXJsO3ZhciBjPSFnLmoucmEoKTtyZXR1cm4gYSYmY307dS5wcm90b3R5cGUuV2Q9ZnVuY3Rpb24oKXtyZXR1cm4gZy5qLkYoKS5yYSYmZy5qLk0oKX07dS5wcm90b3R5cGUuQWU9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHRoaXMuZGlzcGxheSYmMT50aGlzLmRpc3BsYXkuZ2V0RHVyYXRpb24oKSYmNT09PXRoaXMuQy5kdXJhdGlvbn1jYXRjaChhKXtyZXR1cm4hMX19O3UucHJvdG90eXBlLnhlPWZ1bmN0aW9uKCl7dmFyIGE9Zy52LmIoImFkX2ZhbGxiYWNrIiksYz1nLmouYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsoYT1hP2EudXJsOm51bGwpfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0X3Rlc3QueG1sIik7CnJldHVybiBhfTt1LnByb3RvdHlwZS5UYj1mdW5jdGlvbigpe3ZhciBhPXRoaXMueGUoKTt0aGlzLkE9IndlbGVjdCI7dGhpcy5VPXRoaXMua2E9ITA7cmV0dXJuIGEmJihnLmoudHJhY2soInN0YXRzX2hkX2JhY2tmaWxsX3N0YXJ0Iiwid2VsZWN0IiwhMCksYT1nLkgubWEoYSksYT1nLmouTihhLHRoaXMuaSwhMSx7b25seVVSTDohMH0pKT8odGhpcy5lYShhLCEwLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwKTohMX07dS5wcm90b3R5cGUubWE9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7dGhpcy5SZSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoITApfS5iaW5kKHRoaXMpLDIwMCk6KHRoaXMuZGlzcGxheSYmKHRoaXMuZGlzcGxheS5wYXVzZSgpLHRoaXMuYyYmdGhpcy5kaXNwbGF5JiZ0aGlzLmRpc3BsYXkucmVtb3ZlKCkpLHRoaXMuYS5jKCksdGhpcy5hLkcoKSx0aGlzLlZiPSExLGcuai5hKHYuTix0aGlzLmIoKSksdGhpcy5TKCkuZmQoKSl9Owp1LnByb3RvdHlwZS5TPWZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5UJiYoYT10aGlzLmEuVCk7cmV0dXJuIGF9O3UucHJvdG90eXBlLmpiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYigpO2EmJihnLmouRmEodGhpcy52aWRlbyxhKT90aGlzLk1iKCk6dGhpcy5rYygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qYigpfS5iaW5kKHRoaXMpLDEwMCkpfTt1LnByb3RvdHlwZS5xYj1mdW5jdGlvbigpe3ZhciBhPXt9O2lmKHRoaXMuQyl7YS5jbGlja3Rocm91Z2g9dGhpcy5DLlViO2EuZHVyYXRpb249dGhpcy5DLmR1cmF0aW9uO2EuYWRQb2Q9dGhpcy5DLnRkO3ZhciBjPXRoaXMuZGlzcGxheTtjJiYoYS5jdXJyZW50VGltZT1jLmdldEN1cnJlbnRUaW1lKCksYS52aWRlb19kdXJhdGlvbj10aGlzLmRpc3BsYXkuZ2V0RHVyYXRpb24oKSk7dGhpcy5ZJiYwPHRoaXMuWS5sZW5ndGgmJihhLmFkSWRzPXRoaXMuWSl9cmV0dXJuIGF9O3UucHJvdG90eXBlLnFhPQpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuWWQrIi0iK3RoaXMuZ2E7dGhpcy5DJiZ0aGlzLkMuQWQmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5DLkFkKCkpO3JldHVybiBhfTt1LnByb3RvdHlwZS54Yj1mdW5jdGlvbigpe307eShQLHZhKTtQLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7cmV0dXJuITB9O1AucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe307UC5wcm90b3R5cGUueGM9ZnVuY3Rpb24oKXt9O1AucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIDB9O1AucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDB9O1AucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXtyZXR1cm4hMX07UC5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe307UC5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt9O1AucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuITF9O1AucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7fTsKUC5wcm90b3R5cGUuJGE9ZnVuY3Rpb24oKXt9O1AucHJvdG90eXBlLmViPWZ1bmN0aW9uKCl7cmV0dXJuITF9O1AucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbigpe307UC5wcm90b3R5cGUuc2I9ZnVuY3Rpb24oKXt9O1AucHJvdG90eXBlLkdlPWZ1bmN0aW9uKGEpe3RoaXMuTj1hfTtQLnByb3RvdHlwZS5xYT1mdW5jdGlvbigpe3ZhciBhPSEwOy0xPT09dGhpcy5OJiYoYT0hMSk7cmV0dXJuIGF9O1AucHJvdG90eXBlLmpkPWZ1bmN0aW9uKGEpe3RoaXMuaT1hfTtQLnByb3RvdHlwZS5GZT1mdW5jdGlvbihhKXt0aGlzLmM9YX07UC5wcm90b3R5cGUuWWM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jfTtQLnByb3RvdHlwZS5DZT1mdW5jdGlvbihhKXt0aGlzLkM9YX07UC5wcm90b3R5cGUuZWE9ZnVuY3Rpb24oKXt9O1AucHJvdG90eXBlLks9ZnVuY3Rpb24oKXtyZXR1cm4iIn07UC5wcm90b3R5cGUuRz1mdW5jdGlvbigpe3JldHVybiExfTtQLnByb3RvdHlwZS5FZT1mdW5jdGlvbihhKXt0aGlzLkQ9CmF9O3koTCxQKTtMLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dHJ5e3RoaXMuQj0iT25seUhPTUFEIj09PXRoaXMuRC5hYSgpJiZ3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygidC1vbmxpbmUuZGUiKTt2YXIgYT10aGlzLlcoKSxjPXRoaXMuaTt0aGlzLmxhKGEpO2EucHJlbG9hZD0iYXV0byI7Zy52LmIoInZpZGVvLnN0eWxlLnBvc2l0aW9uIikmJihhLnN0eWxlLnBvc2l0aW9uPWcudi5iKCJ2aWRlby5zdHlsZS5wb3NpdGlvbiIpKyIiKTtnLnYuYigidmlkZW8uc3R5bGUiKSYmKGEuc3R5bGU9Zy52LmIoInZpZGVvLnN0eWxlIikrIiIpO3ZhciBkPWcudi5iKCJ2aWRlby5hdHRyaWJ1dGVzIik7aWYoZClmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhLnNldEF0dHJpYnV0ZShlLGRbZV0pO3RoaXMucWEoKSYmKGEudm9sdW1lPXRoaXMuTik7dGhpcy5CfHxnLmouU2IoYSk7dGhpcy5vYSgpO3RoaXMubShhKT8oYS5sb2FkKCksdGhpcy5uYSgpLGMuZyh0aGlzLnJlc2l6ZS5iaW5kKHRoaXMpKSk6CnRoaXMuSih0aGlzLmV2ZW50LlBhLG5ldyBDKEMuaSkpO1AucHJvdG90eXBlLlYuY2FsbCh0aGlzKX1jYXRjaChmKXtyZXR1cm4hMX1yZXR1cm4hMH07TC5wcm90b3R5cGUueGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SKCl9O0wucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO2EucGF1c2UoKTthLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSl9O0wucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5SKCkucGF1c2UoKX07TC5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SKCkucGF1c2VkfHx0aGlzLk99O0wucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlIoKS5wbGF5KCk7aWYoYSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5aP3RoaXMuSih0aGlzLmV2ZW50LlBhLCJwbGF5cHJvbWlzZUZhaWxlZCIpOih0aGlzLk89ITAsdGhpcy5wYXVzZSgpLHRoaXMuSih0aGlzLmV2ZW50LkljKSwKdGhpcy5aPSEwKX0uYmluZCh0aGlzKSk7c2M/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmIuYmluZCh0aGlzKSkpOk1iPWZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5SKCk7dGhpcy5QfHwoYy5sb2FkKCksdGhpcy5wbGF5KCkpfS5iaW5kKHRoaXMpfTtMLnByb3RvdHlwZS5YYT1mdW5jdGlvbigpe3RoaXMuUigpLm11dGVkPSEwfTtMLnByb3RvdHlwZS4kYT1mdW5jdGlvbigpe3RoaXMuUigpLm11dGVkPSExfTtMLnByb3RvdHlwZS5lYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLlIoKS5tdXRlZH07TC5wcm90b3R5cGUuZ2V0Q3VycmVudFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SKCkuY3VycmVudFRpbWV9O0wucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUigpLmR1cmF0aW9ufTsKTC5wcm90b3R5cGUubD1mdW5jdGlvbigpe3JldHVybiExfTtMLnByb3RvdHlwZS5uYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYz10aGlzLlIoKTtjLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oZCl7YS5GYShkKX0pO2MuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLGZ1bmN0aW9uKGQpe2EuaWEoZCl9KTtjLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGQpe2EuTz0hMTthLkthKGQpfSk7Yy5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsZnVuY3Rpb24oZCl7YS5nYShkKX0pO2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGQpe2EuaGEoZCl9KTtjLnN0eWxlJiYoYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihkKXt0cnl7ZC5jdXJyZW50VGFyZ2V0LnBhdXNlZD9hLnBsYXkoKTphLmZhKCl9Y2F0Y2goZSl7YS5mYSgpfX0pfTtMLnByb3RvdHlwZS5yZXNpemU9CmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuUigpO2Muc3R5bGUud2lkdGg9YS53aWR0aCsicHgiO2Muc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9O0wucHJvdG90eXBlLmdhPWZ1bmN0aW9uKGEpe3RoaXMucmVtb3ZlKCk7dGhpcy5KKHRoaXMuZXZlbnQuT2EsYSl9O0wucHJvdG90eXBlLkthPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuUigpO2MuY29udHJvbHM9ITE7dGhpcy5QPSEwO2EuY3VycmVudFRpbWU9Yy5jdXJyZW50VGltZTthLmRpc3BsYXk9dGhpczswPGMuZHVyYXRpb24mJnRoaXMuSih0aGlzLmV2ZW50LnBjLGEpfTtMLnByb3RvdHlwZS5GYT1mdW5jdGlvbihhKXt0aGlzLmZ8fCh0aGlzLlIoKS5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnx8dGhpcy5pYShhKX0uYmluZCh0aGlzKSx0aGlzLmthKSl9O0wucHJvdG90eXBlLmlhPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuQyxkPXRoaXMuUigpO3RoaXMuU3x8IXRoaXMubShkKXx8dGhpcy51fHwKdGhpcy5mfHwodGhpcy5TPSEwLCFnLmoucmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKGMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pPyh0aGlzLnV8fCh0aGlzLnU9ITAsZy5ILmlifHxnLkguQWEoInZpZGVvLW5vb3AiKSksdGhpcy5KKHRoaXMuZXZlbnQuUGEsIk5PT1BWSURFTyIpKTooZC5jb250cm9scz0hMSx0aGlzLkoodGhpcy5ldmVudC5ZYikpKX07TC5wcm90b3R5cGUub2E9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlIoKSxjPXRoaXMubWEoKTtpZih0aGlzLkIpYS5zcmM9Y1swXS51cmw7ZWxzZSBmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKylhLmNhblBsYXlUeXBlKGNbZF0udHlwZSkmJnRoaXMuQShhLGNbZF0udXJsKyIiKX07TC5wcm90b3R5cGUubWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkMuYSxjPU51bWJlcihnLnYuYigiYml0cmF0ZSIpKXx8MUUzO3RyeXt2YXIgZD1hLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4tMSE9CmYudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gTWF0aC5hYnMoYy1mLmJpdHJhdGUpLU1hdGguYWJzKGMtaC5iaXRyYXRlKX0pLGU9YS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuLTE9PWYudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gTWF0aC5hYnMoYy1mLmJpdHJhdGUpLU1hdGguYWJzKGMtaC5iaXRyYXRlKX0pO2E9ZC5jb25jYXQoZSl9Y2F0Y2goZil7fXJldHVybiBhfTtMLnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7ZC5zcmM9YztkLm9uZXJyb3I9dGhpcy5HYS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZCl9O0wucHJvdG90eXBlLkdhPWZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3ZhciBjPXRoaXMuUigpO2MubmV0d29ya1N0YXRlJiZjLm5ldHdvcmtTdGF0ZT09PQpjLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmhhKGEpfTtMLnByb3RvdHlwZS5mYT1mdW5jdGlvbigpe3RoaXMuSih0aGlzLmV2ZW50Lm1jKX07TC5wcm90b3R5cGUuaGE9ZnVuY3Rpb24oYSl7dGhpcy5mPSEwO3ZhciBjPXt9O2lmKGEmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZSlzd2l0Y2goYS50YXJnZXQuZXJyb3IuY29kZSl7Y2FzZSBhLnRhcmdldC5lcnJvci5NRURJQV9FUlJfQUJPUlRFRDpjPUMuYS5uYzticmVhaztjYXNlIGEudGFyZ2V0LmVycm9yLk1FRElBX0VSUl9ORVRXT1JLOmM9Qy5hLm5jO2JyZWFrO2Nhc2UgYS50YXJnZXQuZXJyb3IuTUVESUFfRVJSX0RFQ09ERTpjPUMuYS5uYzticmVhaztjYXNlIGEudGFyZ2V0LmVycm9yLk1FRElBX0VSUl9TUkNfTk9UX1NVUFBPUlRFRDpjPUMuYS5uY31lbHNlIHRoaXMudmlkZW9UYWcubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvVGFnLk5FVFdPUktfTk9fU09VUkNFJiZnLkguSmIoKTt0aGlzLkoodGhpcy5ldmVudC5QYSwKbmV3IEMoQy5tLHtkZXRhaWxzOmMsZXJyb3I6YX0pKX07TC5wcm90b3R5cGUuc2I9ZnVuY3Rpb24oYSl7YS5hcHBlbmRDaGlsZCh0aGlzLlIoKSl9O0wucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofHx0aGlzLkImJmEuc3JjfTtMLnByb3RvdHlwZS5sYT1mdW5jdGlvbihhKXt0aGlzLnZpZGVvVGFnPWF9O0wucHJvdG90eXBlLlI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ307TC5wcm90b3R5cGUuVz1mdW5jdGlvbigpe3ZhciBhPWJiLnBvcCgpO2F8fChhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksYS5pZD1nLmouZygxMCksYS5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3JldHVybiBhfTtMLnByb3RvdHlwZS5iPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5SKCk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuYik7dGhpcy5QfHwoYS5sb2FkKCksYS5wbGF5KCkpfTtmb3IodmFyIGJiPVtdLHhjPTA7MTAwPnhjO3hjKyspe3ZhciBPYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO09iLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPYi5pZD1nLmouZygxMCk7T2IuY29udHJvbHM9ITA7YmIucHVzaChPYil9dmFyIE1iPW51bGwsc2M9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixKYSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsSmEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixKYSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixKYSk7eShvYSxMKTtvYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuYmE/dGhpcy5ZKCk6dGhpcy5EYSgpfTtvYS5wcm90b3R5cGUuWT1mdW5jdGlvbigpe3RoaXMuc2EoKTtMLnByb3RvdHlwZS5wbGF5LmNhbGwodGhpcyl9OwpvYS5wcm90b3R5cGUuRGE9ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO3RoaXMuZGE9dGhpcy5jLnN0eWxlLnpJbmRleDt0aGlzLmMuc3R5bGUuekluZGV4PSIxMDAwIjt0aGlzLnBhKCl9O29hLnByb3RvdHlwZS5zYT1mdW5jdGlvbigpe2lmKHRoaXMuYSl0cnl7b2EuYSgpLHRoaXMuYy5zdHlsZS56SW5kZXg9dGhpcy5kYSx0aGlzLmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmEpfWNhdGNoKGEpe319O29hLnByb3RvdHlwZS5zYj1mdW5jdGlvbihhKXtMLnByb3RvdHlwZS5zYi5jYWxsKHRoaXMsYSk7dGhpcy5zPWF9O29hLnByb3RvdHlwZS56YT1mdW5jdGlvbihhKXt0aGlzLmEuc3R5bGUud2lkdGg9YS53aWR0aCsicHgiO3RoaXMuYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In07b2EucHJvdG90eXBlLnBhPWZ1bmN0aW9uKCl7dGhpcy5pLmcodGhpcy56YS5iaW5kKHRoaXMpKTt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnN0eWxlLnpJbmRleD0xRTY7CmEuc3R5bGUud2lkdGg9IiI7YS5zdHlsZS5oZWlnaHQ9IiI7YS5zdHlsZS5sZWZ0PSIwcHgiO2Euc3R5bGUudG9wPSIwcHgiO2Euc3R5bGUucG9zaXRpb249ImFic29sdXRlIjthLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iI2ZmZiI7YS5pbm5lckhUTUw9dGhpcy5VO3RoaXMuYT1hO3RoaXMucy5hcHBlbmRDaGlsZCh0aGlzLmEpfTtvYS5wcm90b3R5cGUud2E9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2ZldGNoKCJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3NwaWVnZWxTbmlwcGV0Lmh0bWwiKS50aGVuKGZ1bmN0aW9uKGMpe2MudGV4dCgpLnRoZW4oZnVuY3Rpb24oZCl7YS5VPWQ7YS50YSgpfSl9KX07b2EucHJvdG90eXBlLnRhPWZ1bmN0aW9uKCl7dmFyIGE9Zy5qLmcoMTApO3dpbmRvd1thXT1mdW5jdGlvbigpe3RoaXMuWSgpfS5iaW5kKHRoaXMpO3RoaXMuVT10aGlzLlUucmVwbGFjZSgiW09OQ0xJQ0tIQU5ETEVSXSIsIndpbmRvd1snIithKyInXSgpIil9O29hLlNhPQpmdW5jdGlvbigpe2cucWM9ITB9O29hLmE9ZnVuY3Rpb24oKXtnLnFjPSExfTswPD13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJzdm1wdXIiKSYmb2EuU2EoKTt5KE9hLEwpO09hLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7TC5wcm90b3R5cGUuVi5jYWxsKHRoaXMpO3JldHVybiEwfTtPYS5wcm90b3R5cGUuQT1mdW5jdGlvbihhLGMpe2EmJmEuYXBwZW5kQ2hpbGQ/TC5wcm90b3R5cGUuQS5jYWxsKHRoaXMsYSxjKTphLnNldEF0dHJpYnV0ZSgic3JjIixjKX07T2EucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/TC5wcm90b3R5cGUubS5jYWxsKHRoaXMsYSk6ITB9O09hLnByb3RvdHlwZS5XPWZ1bmN0aW9uKCl7dGhpcy5hLmxvYWQoKTtyZXR1cm4gdGhpcy5hfTtPYS5wcm90b3R5cGUucz1mdW5jdGlvbihhKXt0aGlzLmE9YX07T2EucHJvdG90eXBlLnNiPWZ1bmN0aW9uKCl7fTtPYS5wcm90b3R5cGUuZ2E9ZnVuY3Rpb24oYSl7dGhpcy5KKHRoaXMuZXZlbnQuT2EsCmEpfTtPYS5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKGEpe2lmKDAhPWEud2lkdGgmJjAhPWEuaGVpZ2h0KXt2YXIgYz10aGlzLlIoKTtjLnN0eWxlLndpZHRoPWEud2lkdGgrInB4IjtjLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifX07eShWLFApO1YucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXtnLmouZ2EoKTt2YXIgYT0oZy5qLmwuZ2V0KCJjcmVhdGVFbGVtZW50Iil8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpKCJpZnJhbWUiKTt0aGlzLkEoYSk7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7YS5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTthLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt2YXIgYz0KZy52LmIoInZwYWlkSWZyYW1lLnN0eWxlIik7YyYmZy5qLnFhKGEsYysiIik7YS5vbmxvYWQ9dGhpcy5TLmJpbmQodGhpcyk7Yz1nLmouTigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLGcuSCwhMCk7YS5zcmM9YztnLmouWigidnBhaWRldmVudCIsdGhpcy51LmJpbmQodGhpcykpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KKHRoaXMuZXZlbnQuWWIpfS5iaW5kKHRoaXMpLDApO3RoaXMuWSgpO3JldHVybiEwfTtWLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmEsYz1hLnBhcmVudE5vZGU7YSYmYyYmZy5qLmNhKGEpJiZjLnJlbW92ZUNoaWxkKGEpO3RoaXMuQShudWxsKTtnLmouZ2EoKX07Vi5wcm90b3R5cGUueGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTtWLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLkJ9OwpWLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN9O1YucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tfTtWLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLCJjb250cm9sIiwicGxheSIpO3RoaXMuYj0hMX07Vi5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbnRyb2wiLCJwYXVzZSIpO3RoaXMuYj0hMH07Vi5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ifTtWLnByb3RvdHlwZS5YYT1mdW5jdGlvbigpe2cuai5mKHRoaXMuYSwiY29udHJvbCIsIm11dGUiKTt0aGlzLmY9ITB9O1YucHJvdG90eXBlLiRhPWZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLCJjb250cm9sIiwidW5tdXRlIik7dGhpcy5mPSExfTtWLnByb3RvdHlwZS5lYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZ9O1YucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihhKXtnLmouZih0aGlzLmEsCiJyZXNpemUiLHt3aWR0aDphLndpZHRoLGhlaWdodDphLmhlaWdodH0pfTtWLnByb3RvdHlwZS5TPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjLGQsZSxmLGgsbSxELE0sTztyZXR1cm4gRmMoZnVuY3Rpb24oTil7aWYoMT09Ti5hKXtjPWEuaTtkPSExO2MuVC5FYSYmYy5ULkVhKCkmJihkPSEwKTtlPWEuQy5zKCk7Zj1hLkMub2M7ZSYmZS51cmwmJjA8PWUudXJsLmluZGV4T2YoIndlbGVjdC5qcyIpJiYoZy5ILmdldENvbmZpZygpLChoPWcudi5iKCJhZF9mYWxsYmFja19jb25maWciKSkmJmgud2VsZWN0YWxpYXMmJihmPUpTT04uc3RyaW5naWZ5KGgpKSk7bT1hLlljKCk7aWYoIWcuai5CKGUudXJsKSl7RD1lLnVybDtOLmE9MjtyZXR1cm59cmV0dXJuIHFjKE4sZy5qLmthKGUudXJsKSwzKX0yIT1OLmEmJihEPU4uYik7TT1EO089e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZy5ILmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpNLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmUuZGVzaXJlZEJpdHJhdGV8fAplLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6ZixjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpmfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludChtLnN0eWxlLndpZHRoLDEwKSxoZWlnaHQ6cGFyc2VJbnQobS5zdHlsZS5oZWlnaHQsMTApfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6ZH19O2EuVyhPKTtnLmouWigiIixhLnUuYmluZChhKSk7Zy5qLlooInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuSih0aGlzLmV2ZW50Lk9hKX0uYmluZChhKSk7Zy5qLlooInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5KKHRoaXMuZXZlbnQuT2EpfS5iaW5kKGEpKTtjLmcoZnVuY3Rpb24obWEpe2cuai5mKHRoaXMuYSwicmVzaXplIixtYSl9LmJpbmQoYSkpO04uYT0wfSl9O1YucHJvdG90eXBlLnU9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5pO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpeyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPQphLmRhdGEubmFtZSYmYy5vKCEwKTt0aGlzLk89YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiZ0aGlzLkoodGhpcy5ldmVudC5HYyk7IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkoodGhpcy5ldmVudC5FYyk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkoodGhpcy5ldmVudC5LYyk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuSih0aGlzLmV2ZW50LkZjKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuSih0aGlzLmV2ZW50LkhjKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5KKHRoaXMuZXZlbnQuTGMpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5KKHRoaXMuZXZlbnQuT2EpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMucmVtb3ZlKCksdGhpcy5KKHRoaXMuZXZlbnQuT2EpKTsiQWRTa2lwcGVkIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkoodGhpcy5ldmVudC5wZCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYodGhpcy5iYShhLmRhdGEudGltaW5nKSx0aGlzLkoodGhpcy5ldmVudC5xZCxhKSx0aGlzLmI9ITEpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXtjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7dmFyIGQ9dGhpcy5DO2N8fChjPWQuVWIpO2lmKCFjKXJldHVybjt0aGlzLkoodGhpcy5ldmVudC5tYyl9IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJih0aGlzLmI9ITAsdGhpcy5KKHRoaXMuZXZlbnQuSWMpKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmI9ITEsdGhpcy5KKHRoaXMuZXZlbnQub2QpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5mPSEwLHRoaXMuSih0aGlzLmV2ZW50Lk5kKSk6KHRoaXMuZj0hMSx0aGlzLkoodGhpcy5ldmVudC5TZCkpKTsiQWRFcnJvciI9PQphLmRhdGEubmFtZSYmKGM9YS5tZXNzYWdlfHwiIixkPS9cZCsvZywhYyYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYz1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csKGQ9Yy5tYXRjaChkKSk/ZC5qb2luJiYoYz1kLmpvaW4oIi0iKSk6Yz1jLnN1YnN0cmluZygwLDIwKSksdGhpcy5yZW1vdmUoKSx0aGlzLkoodGhpcy5ldmVudC5QYSwidnBhaWRlcnJvciIsYykpOyJibG9ja0NvbnRyb2xzIj09YS5kYXRhLm5hbWUmJih0aGlzLm09ITApOyJ1bmJsb2NrQ29udHJvbHMiPT1hLmRhdGEubmFtZSYmKHRoaXMubT0hMSl9fTtWLnByb3RvdHlwZS5iYT1mdW5jdGlvbihhKXthJiYodGhpcy5zPWEuZHVyYXRpb24sdGhpcy5CPWEuY3VycmVudFRpbWUsdGhpcy5QPWEucmVtYWluaW5nVGltZSl9O1YucHJvdG90eXBlLlc9ZnVuY3Rpb24oYSl7Zy5qLmYodGhpcy5hLCJjb25maWciLGEpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLAoiY29uZmlnIixhKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLCJjb25maWciLGEpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2cuai5mKHRoaXMuYSwiY29uZmlnIixhKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLCJjb25maWciLGEpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsCmEpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksNUUzKX07Vi5wcm90b3R5cGUuc2I9ZnVuY3Rpb24oYSl7YS5hcHBlbmRDaGlsZCh0aGlzLmEpfTtWLnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtWLnByb3RvdHlwZS5ZPWZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVSl9O1YucHJvdG90eXBlLlU9ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmImludGVydmVudGlvbiI9PWEuZGF0YS5ldmVudCYmZy5qLnRyYWNrKCJzdGF0c19oZF9pbnRlcnZlbnRpb24iLGEuZGF0YS5pZCwhMCl9O3koUixQKTtSLnByb3RvdHlwZS5jb250aW51ZT1mdW5jdGlvbigpe3RoaXMubSYmKHRoaXMuUCgpLHRoaXMudSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BKCl9LmJpbmQodGhpcyksMCkpfTsKUi5wcm90b3R5cGUuWmE9ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLkQ7ZCYmZC53ZCYmZC53ZChhLGMpfTtSLnByb3RvdHlwZS5lYT1mdW5jdGlvbigpe2cuai50cmFjaygidnJ0Y2x6cl9za2lwZWQiLCIiLCEwKTt0aGlzLlphKCJza2lwIix7fSl9O1IucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0cnl7aGlzdG9yeS5wdXNoU3RhdGUoe3ZlcnRpY2FsOiEwfSwiIiwiIyIrZy5qLmcoNSkpLGhpc3RvcnkucHVzaFN0YXRlKHt2ZXJ0aWNhbDohMH0sIiIsIiMiK2cuai5nKDUpKX1jYXRjaChhKXt9d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvcHN0YXRlIixmdW5jdGlvbihhKXthJiZhLnN0YXRlJiZhLnN0YXRlLnZlcnRpY2FsJiZ0aGlzLmEuY2xvc2UoKX0uYmluZCh0aGlzKSl9O1IucHJvdG90eXBlLks9ZnVuY3Rpb24oKXtyZXR1cm4icG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiBjYWxjKDE4JSk7IGJvdHRvbTogOXB4OyB3aWR0aDogNjQlOyB0ZXh0LWFsaWduOiBjZW50ZXI7In07ClIucHJvdG90eXBlLkc9ZnVuY3Rpb24oYSl7YT1hLnJlcGxhY2UoIlNraXAgQWQiLCJXZXJidW5nICZ1dW1sO2JlcnNwcmluZ2VuIik7cmV0dXJuIGE9YS5yZXBsYWNlKC88ZGl2IHN0eWxlPSJbYS16QS1aMC05OjtcLlxzXChcKVwtLCNdKiIvZ2ksJzxkaXYgc3R5bGU9IndpZHRoOjEwMCU7IGhlaWdodDogMzBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBSb2JvdG8sIGFyaWFsLCBzYW5zLXNlcmlmOyBvcGFjaXR5OiAwLjY7IGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGxpbmUtaGVpZ2h0OiAzMHB4OyInKX07Ui5wcm90b3R5cGUuQT1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTthLmhyZWY9dGhpcy5zLmNzc3x8Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3ZlcnRpY2FsaXpyL3ZlcnRpY2FsaXpyLmNzcyI7YS5yZWw9InN0eWxlc2hlZXQiO2EudHlwZT0idGV4dC9jc3MiOwpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGEpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3ZlcnRpY2FsaXpyL3N3aXBlLm1pbi5qcyI7YS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Eub25sb2FkPWZ1bmN0aW9uKCl7dGhpcy5PPSEwO3RoaXMuVygpfS5iaW5kKHRoaXMpO2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYSl9O1IucHJvdG90eXBlLlM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM7RmMoZnVuY3Rpb24oZCl7aWYoMT09ZC5hKXJldHVybiBnLnYuY2xpZW50LnRjZl9jb25maWc9ITAscWMoZCxnLmouZmIoZy5ILm1hKGEuVSkpLDIpO2M9ZC5iO2ZldGNoKGMse2NyZWRlbnRpYWxzOiJpbmNsdWRlIn0pLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIGUuanNvbigpfSkudGhlbihmdW5jdGlvbihlKXtlLmFkdmVydGlzZW1lbnRzJiYxPGUuYWR2ZXJ0aXNlbWVudHMubGVuZ3RoPyhhLkooYS5ldmVudC5ZYiksCmEuYj1lLmFkdmVydGlzZW1lbnRzLGcuai50cmFjaygidnJ0Y2x6cl9zdWNjZXNzIiwiIiwhMCksYS5tP2EubSgpOmEuQSgpKTooZS5yZWFzb24/Imluc3VmZmljaWVudF9hZHMiPT09ZS5yZWFzb24/Zy5qLnRyYWNrKCJ2cnRjbHpyX2Vycm9yIiwiaW5zdWZmaWNpZW50X2FkcyIsITApOiJvYmplY3QiPT09dHlwZW9mIGUucmVhc29uJiZlLnJlYXNvbi5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmcuai50cmFjaygidnJ0Y2x6cl9lcnJvciIsInVuYXZhaWxhYmxlIiwhMCk6Zy5qLnRyYWNrKCJ2cnRjbHpyX2Vycm9yIiwidW5rbm93biIsITApLGEuZigpLGEuSihhLmV2ZW50LlBhLCJ2ZXJ0aWNhbGl6ciIpLGEuWmEoImVycm9yIix7fSkpfSkuY2F0Y2goZnVuY3Rpb24oKXtnLmoudHJhY2soInZydGNsenJfZXJyb3IiLCJhcGkiLCEwKTthLmYoKTthLkooYS5ldmVudC5QYSwidmVydGljYWxpenIiKTthLlphKCJlcnJvciIse30pfSk7ZC5hPTB9KX07Ui5wcm90b3R5cGUuU2M9ZnVuY3Rpb24oKXt0aGlzLmEucGxheWVyLnRyYWNrKCJjbGlja3RyYWNraW5nIik7CndpbmRvdy5vcGVuKHRoaXMuYS5hLnhkLCJfYmxhbmsiKX07Ui5wcm90b3R5cGUuVz1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYz1bXTt0aGlzLmIuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgZT1uZXcgVygiIiwhMCk7ZC5jb250ZW50X3BpZWNlcz1kLmNvbnRlbnRfcGllY2VzLnNvcnQoZnVuY3Rpb24oZil7cmV0dXJuLTE9PT1mLnJhdGlvLmluZGV4T2YoIjk6MTYiKT8xOi0xfSk7ZC5zcmM9ZC5jb250ZW50X3BpZWNlc1swXS5yZXNvdXJjZTtjLnB1c2goZS5iYShkLnNyYysiJnByZWZldGNoPXRydWUiKSl9KTtQcm9taXNlLmFsbChjLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZC5jYXRjaChmdW5jdGlvbihlKXtyZXR1cm4gZX0pfSkpLnRoZW4oZnVuY3Rpb24oZCl7YS5iLmZvckVhY2goZnVuY3Rpb24oaCxtKXtkW21daW5zdGFuY2VvZiBXJiYoaC52YXN0X2RhdGE9ZFttXSl9KTtpZihhLmIuZmlsdGVyKGZ1bmN0aW9uKGgpe3JldHVybiFoLmhhc093blByb3BlcnR5KCJ2YXN0X2RhdGEiKX0pKWZvcih2YXIgZT0KYS5iLmZpbHRlcihmdW5jdGlvbihoKXtyZXR1cm4haC5oYXNPd25Qcm9wZXJ0eSgidmFzdF9kYXRhIil9KSxmPTA7ZjxlLmxlbmd0aDtmKyspZy5qLnRyYWNrKCJ2cnRjbHpyX25vdmFzdCIsZVswXS5pZC50b1N0cmluZygpLCEwKTthLmIuZmlsdGVyKGZ1bmN0aW9uKGgpe3JldHVybiBoLnZhc3RfZGF0YX0pLmxlbmd0aD9hLmEuZ2EoYS5iLmZpbHRlcihmdW5jdGlvbihoKXtyZXR1cm4gaC52YXN0X2RhdGF9KSk6KGEuZigpLGEuSihhLmV2ZW50LlBhLCJ2ZXJ0aWNhbGl6ciIpLGEuWmEoImVycm9yIix7fSkpfSl9O1IucHJvdG90eXBlLlA9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuYS5wbGF5ZXIub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGMpe2EuQj0hMDtjLmRpc3BsYXk9YTthLkooYS5ldmVudC5wYyxjKTthLlphKCJ0aW1ldXBkYXRlIixjKX0pO3RoaXMuYS5wbGF5ZXIub24oImVuZGVkIixmdW5jdGlvbihjKXthLkooYS5ldmVudC5PYSxjKTthLlphKCJlbmRlZCIsYyl9KTsKdGhpcy5hLm9uKCJ2aWRlb3N0YXJ0IixmdW5jdGlvbigpe2EuSigidW5jbG9zZSIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGM9dGhpczt0aGlzLnBhcmVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtjLkooYy5ldmVudC5tYyk7Yy5aYSgiY2xpY2t0aHJvdWdoIix7fSl9KX0uYmluZChhKSwwKX0pO3RoaXMuYS5vbigiY2xvc2UiLGZ1bmN0aW9uKCl7YS5KKCJjbG9zZSIpO2EuWmEoImNsb3NlIix7fSl9KX07Ui5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3JldHVybiEwfTtSLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLmYoKX07Ui5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3RoaXMuYj1udWxsO3RoaXMuYSYmKHRoaXMuYT10aGlzLmEuWigpKX07Ui5wcm90b3R5cGUueGM9ZnVuY3Rpb24oKXt9O1IucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYSYmdGhpcy5hLnBsYXllcj90aGlzLmEucGxheWVyLmdldEN1cnJlbnRUaW1lKCk6Ci0xfTtSLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmEmJnRoaXMuYS5wbGF5ZXI/dGhpcy5hLnBsYXllci5nZXREdXJhdGlvbigpOi0xfTtSLnByb3RvdHlwZS5sPWZ1bmN0aW9uKCl7fTtSLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLkI/KHRoaXMuYS5yZXN1bWUoKSx0aGlzLmEucGxheWVyLnBsYXkoKSk6dGhpcy5PP3RoaXMuYS5TYSgpOnNldFRpbWVvdXQoZnVuY3Rpb24oKXthLnBsYXkoKX0sNTApO3RoaXMuSigidW5jbG9zZSIpfTtSLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuYSYmdGhpcy5hLnBsYXllci5wYXVzZSgpfTtSLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3ZhciBhPSEwO3RoaXMuYSYmKGE9dGhpcy5CP3RoaXMuYS5wbGF5ZXIuaXNQYXVzZWQoKTohMCk7cmV0dXJuIGF9O1IucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7dGhpcy5hLnBsYXllci5YYSgpfTtSLnByb3RvdHlwZS4kYT0KZnVuY3Rpb24oKXt0aGlzLmEucGxheWVyLiRhKCl9O1IucHJvdG90eXBlLmViPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5wbGF5ZXIuZWIoKX07Ui5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKGEpe3RoaXMuYSYmdGhpcy5hLnJlc2l6ZShhKX07Ui5wcm90b3R5cGUuc2I9ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQ9YTt0aGlzLmEud2I9YTt0aGlzLmEuYXBwZW5kKCk7dGhpcy5hLnNob3coKX07eShTLHZhKTtTLnByb3RvdHlwZS5sYT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5iLmlkPSJsaW1vIjt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmIpO3RoaXMuQS5pZD0ibGltb19zd2lwZXIiO3RoaXMuQS5jbGFzc0xpc3QuYWRkKCJzd2lwZSIpO3RoaXMuYi5hcHBlbmRDaGlsZCh0aGlzLkEpO3RoaXMuRy5pZD0ibGltb19zd2lwZXJfY29udGVudCI7dGhpcy5BLmFwcGVuZENoaWxkKHRoaXMuRyk7dGhpcy5sLmlkPSJtZW51Ijt0aGlzLmwuY2xhc3NMaXN0LmFkZCgic3RhcnQiKTsKdGhpcy5sLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInVsIikpO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMubCk7dGhpcy5PLmlkPSJoZWFkZXIiO3RoaXMubT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTt0aGlzLm0uaWQ9ImxvZ28iO3RoaXMubS5jbGFzc0xpc3QuYWRkKCJzdGFydCIpO3ZhciBjPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS92ZXJ0aWNhbGl6ci9sb2dvLXN2bS5wbmciO2cuai5iKCJzcGllZ2VsLmRlIikmJihjPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS92ZXJ0aWNhbGl6ci9sb2dvLXNwb24ucG5nIik7Zy5qLmIoIndlYi5kZSIpJiYoYz0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vdmVydGljYWxpenIvbG9nby13ZWJkZS5wbmciKTt0aGlzLm0uc3JjPShnLnYuYigidmVydGljYWxpenIiKXx8e30pLmxvZ298fGM7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5tKTsKdGhpcy5mPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuZi5pZD0iY2xvc2UiO3RoaXMuZi5jbGFzc0xpc3QuYWRkKCJzdGFydCIpO3RoaXMuZi5pbm5lckhUTUw9IjxpbWcgc3R5bGU9J21hcmdpbi10b3A6M3B4O21heC13aWR0aDoyMHB4Oycgc3JjPSdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJrQUFBQVpDQVlBQUFERTZZVmpBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlWcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFl1TUMxak1EQXlJRGM1TGpFMk5EUTJNQ3dnTWpBeU1DOHdOUzh4TWkweE5qb3dORG94TnlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SURJeExqSWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2TVRZeE1qSkdSamxDTlRZd01URkZRVGc0TmtORE5UZENRVEU0TVRRMk9FUWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZNVFl4TWpKR1JrRkNOVFl3TVRGRlFUZzROa05ETlRkQ1FURTRNVFEyT0VRaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEb3hOakV5TWtaR04wSTFOakF4TVVWQk9EZzJRME0xTjBKQk1UZ3hORFk0UkNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRveE5qRXlNa1pHT0VJMU5qQXhNVVZCT0RnMlEwTTFOMEpCTVRneE5EWTRSQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGwwOEJJSUFBQVNmU1VSQlZIamFmRlpYUzZ4SkVHMFFVZlFmaUdCQVRCZ1FNK2FNK2lTWVhsWk02TDNxT041UnhDeGl3SUFpZ2lEK0FSOTJGNVpsUVphNyt5THVneTlteGF5WXMydFdETFZWamRYMnJISUgrcHR2cXJ2cjlLbXVVelhpNWVWRjNOM2RpZGpZMkY4dExTMlBhbXBxdmdLQXVMcTZFcHVibTJKaFlVSE16czdLTVRNekk3K1hscGJrV0ZsWkVSc2JHMkpuWjBkY1gxOEwydGZlM3A1allXRng1T25wT1VvK3lDWWZZV0ZodndsODVkSGIyMnNnKytIaG9aaWJtL3NoeU5yYW1qZzVPWkYraG9hRzh0bUhsWlVWQkFRRWZIOTlmUlVpT2pyNmR6TGlBa2hPVGxaQVhWMWQ1YlJ4ZlgxZFRFMU5mUXBDWTNkM1Z3SU1EQXdVOGQ3YTJsb1lHeHVUNzRHQmdYOEtuaWdxS29LbnB5ZEFWZ3FvdGJYVlNBN294TlBUMDJZZ2k0dUxZbXRyU3dMMDkvY1g4cDZ5c2pLNHZMd0ViMjl2NVVmMDlmVjk0UjhKQ1FudzhQQUE4Zkh4YWtGZFhWMGxBekVqQXFDN0lEc3lMdWExVlZWVmNIRnhBWFoyZG1wL1IwZUhTUzVFb0RJMnBxYW13dlB6TTBSR1J1cEFGYlNPR0V4T1R1b0Fpb0hCWUlDYm14dHdjSEJRKzVxYm0ydlV4ZFBvN093czUwbk1OTWtvTVRGUmJjQ3NrNHdZQUUrb0ltQXltZUQ4L0J6czdlMUJzOVd4YjBHM2ozZkI2YWVBa3BLU2dENTY2Qm9hR2tyZm1QL0V0cEtTRXJpL3Z3ZEhSOGNQQUxlM3QrOGdTRk1PTWpRMU5abDRjVnhjSEtDR0lDVWxSVG5BRFB5RjM4dkx5K1VkT0RrNWdXWnJKRDk3ZTN2aStQajRIWVFRS2RmUHpzNmtFV05wMUVOSEgyS21hNm00dUJnZUh4L0IyZGxaMlNvcUt1cHBQNG1UN3UvMDlOUWNoQUFvNTBtQU5GRmZYNjhZUlVWRlNVWnBhV255dDlGb2xBeDBBTFRWODUxUjlxMnVybjRPc3IrL0wwc0pDd3daR2F5dHJXL0pDV1ViQ1F3dkhNYkh4OEhGeFlXVmZWOVpXVm5EQUtRbEZxb0tGejJvZGhFSXhaRVVUdldLZ1RCTVAydmgrQkM2OFBEd1VWcEg2eW05YVMrVkdnb1ppdklkQkxORGhZdW8waUt5ZDNkMzU5bmEydjdMRldGaVlnSXlNek1CSGFuUTJkallYRGMyTnBiUit1WGxaVm5ycUJLUVAvTDdBV1I3ZTF2cEFOTlo2U0EvUDErV0NoOGZIL2s3SmlZR01NUUs2SzFlU2NIU0FTa2FGQ3FWd2d4QzJYVjBkTVJDVTBvdUxDeVVOYzNWMWRVc3U0S0NnZ0R2RXpJeU1uUWdXZXNPRGc1a0FwbUIwSjF3UDlDVm5KdWJDOWdUQUhzRGFKazJ5dThoSVNHU1VYcDZ1bDRaVE55UFdIdnl3WXBISlJmOG40Rzd1N3R5Z0ZsVVRldmEydHJVUWZ6OS9TV2o3T3hzdGE2bHBjV28rMVcxQzh1MTZnYzVPVG1Bek1ETHkrdUREaWhyNkJzdnU0TG5zR2ZJNHFnRDRVRytxZHBGaitIaDRUeWV6TXZMa3d6YzNOdytLSmtFUm4yRis0aGVHWHg5ZlFGYnVUeWcxbUZsMW9uQndjRWNObVpsWmNrWWN4YTlNV2prckNFZHpNL1BtelVzQkZLVndjL1BUMVlHblJHMmd5K3FNNWFXbHNvKzR1SGhvUlpVVjFmWGNRdm16a2dnM0JrNWRCZ2F4WWlTaEdvYTduM1B4dERRMEwvb3BhQ2dBSUtEZzlVRTFpNEpRR1dHQUVoa09nZ05FaCtsNjV1dXZ2RmUvQU1CSXlNakREb3VGeURONzdvR3VLTlJybE83SllEUFFPaU9pQ1gvVytucDZUSG9makF6LzBGV2xuS1Nha3hFUk1RZitML3JCS2xYa1EycnJIUkN0ZWhISU1TVTdvZnJGR1pwQ2ZvNXhvUC96ZUwrVDRBQkFMY2RPTE1lQmpGYkFBQUFBRWxGVGtTdVFtQ0MnPjwvaW1nPiI7CnRoaXMuZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXthLmNsb3NlKCk7YS5LfHwoZy5qLnRyYWNrKCJ2cnRjbHpyX2Nsb3NlZCIsIiIsITApLGEuSz0hMCl9KTt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmYpO3RoaXMubGFiZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5sYWJlbC5pZD0idGl0bGUiO3RoaXMubGFiZWwuaW5uZXJIVE1MPSJOdXIgZWluIFNwb3QgSWhyZXIgV2FobCI7dGhpcy5sYWJlbC5jbGFzc0xpc3QuYWRkKCJzdGFydCIpO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMubGFiZWwpO3RoaXMucz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLnMuY2xhc3NMaXN0LmFkZCgibGltb19zcGlubmVyIik7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zKTt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLk8pfTtTLnByb3RvdHlwZS5TYT1mdW5jdGlvbigpe3RoaXMuRD0hMX07ClMucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbigpe307Uy5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJib2R5LW5vLXNjcm9sbCIpO3RoaXMud2IuZmlyc3RDaGlsZD90aGlzLndiLmluc2VydEJlZm9yZSh0aGlzLmNvbnRhaW5lcix0aGlzLndiLmZpcnN0Q2hpbGQpOnRoaXMud2IuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpfTtTLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheT0iYmxvY2sifTtTLnByb3RvdHlwZS5rYT1mdW5jdGlvbigpe3RoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXk9Im5vbmUifTtTLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtoaXN0b3J5LnB1c2hTdGF0ZSh7dmVydGljYWw6ITB9LCIiLCIjIitnLmouZyg1KSk7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJib2R5LW5vLXNjcm9sbCIpO0FycmF5LmZyb20odGhpcy5pKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2xhc3NMaXN0LnJlbW92ZSgiY2xvc2VkIil9KTsKdGhpcy5EPSExfTtTLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiYm9keS1uby1zY3JvbGwiKTtBcnJheS5mcm9tKHRoaXMuaSkuZm9yRWFjaChmdW5jdGlvbihhKXthLmNsYXNzTGlzdC5hZGQoImNsb3NlZCIpfSk7dGhpcy5wbGF5ZXIuaXNQbGF5aW5nfHx0aGlzLmthKCk7dGhpcy5EPSEwO3RoaXMuSigiY2xvc2UiKX07Uy5wcm90b3R5cGUucGE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9MzAsZDt0aGlzLk49c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtkPXBhcnNlSW50KGMlNjAsMTApO2Q9MTA+ZD8iMCIrZDpkO2EubGFiZWwuaW5uZXJIVE1MPSJOdXIgZWluIFNwb3QgSWhyZXIgV2FobDxicj5zdGFydGV0IGluICIrZCsiIFNla3VuZGVuIjtkb2N1bWVudC5oYXNGb2N1cygpJiYhYS5EJiYtMT49LS1jJiYoYz0zMCxjbGVhckludGVydmFsKGEuTiksYS5uYSgpKX0sMUUzKX07Uy5wcm90b3R5cGUuZ2E9ZnVuY3Rpb24oYSl7dmFyIGM9CnRoaXMsZDtGYyhmdW5jdGlvbihlKXtzd2l0Y2goZS5hKXtjYXNlIDE6aWYoIWEubGVuZ3RoKXJldHVybiBlLnJldHVybigpO2MuQj1hO2Q9MDtjYXNlIDI6aWYoIShkPGMuQi5sZW5ndGgpKXtlLmE9NDticmVha31yZXR1cm4gcWMoZSxjLmhhKGMuQltkXS52YXN0X2RhdGEpLDMpO2Nhc2UgMzpkKys7ZS5hPTI7YnJlYWs7Y2FzZSA0OmMuQi5mb3JFYWNoKGZ1bmN0aW9uKGYsaCl7Yy5pLnB1c2goYy5pYShmLGgpKTtjLmVhKGgpfSksZS5hPTB9fSl9O1MucHJvdG90eXBlLmhhPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMsZCxlLGYsaCxtO3JldHVybiBGYyhmdW5jdGlvbihEKXsxPT1ELmEmJihkPTApO2lmKDUhPUQuYSl7aWYoIShkPGEuYi5sZW5ndGgpKXtELmE9MDtyZXR1cm59ZT1hLmJbZF07Zj1lLmE9Yy5kYShlLmEpO3JldHVybiBxYyhELGcuai5rYShmWzBdLnVybCksNSl9aD1ELmI7bT1nLmouQShoKTtlLmFbMF0udXJsPSJodHRwczovL3d3dy52ZXJ0aWNhbGl6ci5jb20vYXBpL3ZlcnRpY2FsaXplci8/bWVkaWFmaWxlPSIrCm07ZCsrO0QuYT0yfSl9O1MucHJvdG90eXBlLmRhPWZ1bmN0aW9uKGEpe3ZhciBjPU51bWJlcihnLnYuYigiYml0cmF0ZSIpKXx8MUUzO3RyeXt2YXIgZD1hLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4tMSE9Zi50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihmLGgpe3JldHVybiBNYXRoLmFicyhjLWYuYml0cmF0ZSktTWF0aC5hYnMoYy1oLmJpdHJhdGUpfSksZT1hLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4tMT09Zi50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihmLGgpe3JldHVybiBNYXRoLmFicyhjLWYuYml0cmF0ZSktTWF0aC5hYnMoYy1oLmJpdHJhdGUpfSk7YT1kLmNvbmNhdChlKX1jYXRjaChmKXt9cmV0dXJuIGF9O1MucHJvdG90eXBlLm5hPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPXRoaXMuQlt0aGlzLnUuZ2V0UG9zKCldO2cuai50cmFjaygidnJ0Y2x6cl9jaG9zZW5fYXV0byIsdGhpcy51LmdldFBvcygpLCEwKTt0aGlzLlUoKTsKdGhpcy5KKCJ2aWRlb3N0YXJ0Iik7dmFyIGQ9Yy52YXN0X2RhdGEsZT1jLmlkO2ZldGNoKGcuai5vKGMuc3JjLCEwKSkudGhlbihmdW5jdGlvbigpe2EucGxheWVyLmMoe2lkOmUsYWxpYXM6YS5hLnJjfSk7dmFyIGY9ZC5aYygpO2EuYS54ZD1mLlViO2EuYS5KKCJTSE9XQ09OVFJPTFMiKTthLnBsYXllci5zdGFydChmKX0pfTtTLnByb3RvdHlwZS5VPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztBcnJheS5mcm9tKHRoaXMuY29udGFpbmVyLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2MhPWEucGxheWVyLmNvbnRhaW5lciYmYyE9YS5PJiZjIT1hLm0mJmMhPWEubGFiZWwmJihjLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTtjPT1hLmxhYmVsJiYoYS5sYWJlbC5pbm5lckhUTUw9Ik51ciBlaW4gU3BvdCBpaHJlciBXYWhsIixhLmxhYmVsLnN0eWxlLm1hcmdpblRvcD0iN3B4Iil9KTt0aGlzLmYuc3R5bGUuZGlzcGxheT0iYmxvY2siO3RoaXMuYy5zdHlsZS56SW5kZXg9IjExMDAwIjt0aGlzLmMuc3R5bGUudG9wPQoiNzBweCI7dGhpcy5jLnN0eWxlLnJpZ2h0PSIwcHgiO3RoaXMuYy5zdHlsZS5jb2xvcj0id2hpdGUiO3RoaXMuYy5zdHlsZS5mb250RmFtaWx5PSJSb2JvdG8sIGFyaWFsLCBzYW5zLXNlcmlmIjt0aGlzLmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmMuaW5uZXJIVE1MPSc8ZGl2IHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFJvYm90bywgYXJpYWwsIHNhbnMtc2VyaWY7IG9wYWNpdHk6IDAuNzsgcGFkZGluZzogNnB4OyBib3JkZXI6ICNGRkZGRkY7IGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyI+TWVociBlcmZhaHJlbjwvZGl2Pic7dGhpcy5jLm9uY2xpY2s9dGhpcy5hLlNjLmJpbmQodGhpcy5hKTt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmMpfTtTLnByb3RvdHlwZS5xYT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5XKys7dGhpcy5XPj10aGlzLmkubGVuZ3RoJiYoZy5qLnRyYWNrKCJ2cnRjbHpyX2FuaW1hdGlvbnN0YXJ0IiwKIiIsITApLHRoaXMuaS5yZXZlcnNlKCksdGhpcy5pLmZvckVhY2goZnVuY3Rpb24oYyxkKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5jbGFzc0xpc3QucmVtb3ZlKCJzdGFydCIpO2Eub2EoZCk7ZCE9PWEuaS5sZW5ndGgtMT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5jbGFzc0xpc3QuYWRkKCJvdXQiKX0sNzUwKTpzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5zYSgpfSw3NTApfSw3NTAqZCl9KSx0aGlzLmkucmV2ZXJzZSgpKX07Uy5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oKXt0aGlzLm0uY2xhc3NMaXN0LnJlbW92ZSgic3RhcnQiKTt0aGlzLmxhYmVsLmNsYXNzTGlzdC5yZW1vdmUoInN0YXJ0Iik7dGhpcy5sLmNsYXNzTGlzdC5yZW1vdmUoInN0YXJ0Iik7dGhpcy5mLmNsYXNzTGlzdC5yZW1vdmUoInN0YXJ0Iik7dGhpcy5HLmNsYXNzTGlzdC5hZGQoInN3aXBlLXdyYXAiKTt0aGlzLnMucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLnMpO3RoaXMubGFiZWwuaW5uZXJIVE1MPQoiTnVyIGVpbiBTcG90IElocmVyIFdhaGw8YnI+c3RhcnRldCBpbiAzMCBTZWt1bmRlbiI7Zm9yKHZhciBhPXRoaXMuaS5sZW5ndGgtMTswPD1hO2EtLSl0aGlzLmlbYV0uY2xhc3NMaXN0LnJlbW92ZSgib3V0Iik7dGhpcy5QKDApO3RoaXMucGEoKTt0aGlzLm1hKCl9O1MucHJvdG90eXBlLmlhPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcyxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuY2xhc3NMaXN0LmFkZCgic3dpcGUtaXRlbSIpO2UuY2xhc3NMaXN0LmFkZCgic3RhcnQiKTtnLmouZmIoYS5wb3J0cmFpdF9pbWFnZV91cmx8fGEuaW1hZ2VfdXJsKS50aGVuKGZ1bmN0aW9uKGgpe2ZldGNoKGgpLnRoZW4oZnVuY3Rpb24obSl7cmV0dXJuIG0uYmxvYigpfSkudGhlbihmdW5jdGlvbihtKXtlLnN0eWxlLmJhY2tncm91bmRTaXplPSJjb3ZlciI7ZS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9InVybCgnIitVUkwuY3JlYXRlT2JqZWN0VVJMKG0pKyInKSJ9KS50aGVuKGZ1bmN0aW9uKCl7ZC5xYSgpfSl9KTsKdmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJpY29uLXBsYXkiKTtmLnNldEF0dHJpYnV0ZSgiZGF0YS1pZCIsYyk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTtjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFZ0FBQUJJQ0FZQUFBQlY3Yk5IQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5VnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFE0SURjNUxqRTJOREF6Tml3Z01qQXhPUzh3T0M4eE15MHdNVG93TmpvMU55QWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lESXhMakVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk1ERTJNamN4TjBRMU5qSkRNVEZGUVVJeFFUTkNRakF3UlROQk5rRTNPRVlpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TURFMk1qY3hOMFUxTmpKRE1URkZRVUl4UVROQ1FqQXdSVE5CTmtFM09FWWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG93TVRZeU56RTNRalUyTWtNeE1VVkJRakZCTTBKQ01EQkZNMEUyUVRjNFJpSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEb3dNVFl5TnpFM1F6VTJNa014TVVWQlFqRkJNMEpDTURCRk0wRTJRVGM0UmlJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtZnUrdFVBQUFqM1NVUkJWSGphNUp4L2JGUFhGY2Z2czUvdCtFZU03V0R5eStGbjJnSWhJMkV0Q3hBZ0NTMVN0MElIU2xzMkNsM1hyWU9sWTZCTmRGSlZUV2hyWVdxNzBpRmFGR21NVG11blRtRmIxMEZhdWdGdGFFTGFORkJDQTA0Z0pIRmk0OWl4RXlja3NiR2QzVE5mc3pjclRtTDd2dWNmUGRMM0g0anY4L3Y0M0hQUHViOFlKS3lKc1BLd0RGaVpSTE93bEZneXJEVHlkMk5ZYnF4YldIMVlWcUllTEJPV1g2Z3Z6QWp3REMxV01kWkNyTHV3RkRHMk40TFZqblVWcXhscklCa0JTYkR1eFZxRmxjL2pjOENUcm1BMUVsaTNFeDJRSEtzQ3F4d3JYZUR1TzRSMUJ1czAxbWlpQVdJSmxHOVM2RUt4R3NTdFdnTExtd2lBN3NGNm5BVGJSRElJN24vQ01zWUxrQlNyRW11TlFNRStHaHZIK2hpckJzc2pKQ0FZbm5kZzVhRGtNRFBXRVpJcVJHVGlLQjYyR0dzM2xnNGxqOEdBc1FLckc4dkdKNkFTcktkSjkwbzJnNEZrT1phREpKelVBYTNHMms2eTRXUTFDQ2xMc1FhSk4xRUQ5SFdzSjVJY0RoZlNFaEtQekRRQUxTUUJXWXhTeDRLZTFJRmxqd1VRakZaN1NDR1phZ2E5b1FqckFra3V3LzdSWkhuT0RsSStwS3JKeVR0S28vR2dSN0VLVWVwYk9pbVBMa2ZpUVZDQnIwVmZIVnRMM25sYUhnVFFxckRVRkNNaU0wK24xMjhzcjdobmZtWldoZ3d4TXV2Z2dDdkJndlpjckRwU25rd0thQjFKQ0tuQmVmSFo1OHIrY3Vya3FvMWJIc3Q5N01udnpTNWJzeWJYMGRuRnlNYVJ6RExnSEV3UVNHb3lUZEl4R2FBcGcxYWt0bVBMMXVVdkhINnR3T3Yxb3ZIeGNlVDMrMUZHVnBha2N2czJRODRzdmRyZTJlWFh5dVZLaXpNaFFNMGp4YTAzSEtEMU5BUHozSmtaK2lQSGpxNU0xMmpaMFA4RFVIY3ZXYUo4OUludGN6MkRMcWJmYlBhYkhZNTRRNUtRcXI5OUlrQVMyblZXcmk1RCs5d0xMeTRDR0JQT1JXQ1BFb2xFYUVWRnVlN2h6WnZuK3V6OU10L29DSXRCRGNRUlVpNEtUTGI1UXdGOWd4UnoxQ3h2cGs3NzlLNmY1b2NEeEFVbFY2bEVEMjdlbkxsc1daSGVhVGFKTkNxNXltUzFPZU1BQ0J5a0wxalFjZ0Z0d2NxZ0NpaExyLzFCMVU4V1RBV0kyKzJ5REhteVI3WnVNNmlVS3NXbzB5YkdUV2k2elZhSHdKQlVXUFhjUEVnWExnK0l4Y1F5U2NUMUczaVRENE9xM0xvdDY1MzNha3UvOWRERHM5ZVdGTjh0TUtBRmhNa2REMXBCS2x5NlEwSjJac2FUUDlvNWI3b2VGQXBLekxLb3RLeGNWMUcrTG1mVVpaZktwU0tGUU43RWtIbWpHMEZBRzdIMHRKOWkwT3MwMzk5Wk5UOGFRRnhRYW8xV3ZHRlRaZGI4T2ZPMExzZE5jVmFHZGtabmo2VmZBRWlOTE9sbStYdzh3ZXYxVVZraUJraVFSNjFlOTRCbVpWbDV5VnZIanZhS0dKSG9kRVBUVlI0QkFSTXhlTkFjckRJK25wQ05mK2tmUHJNclB4WVBDZ1hGTUF3cXZ2Yys5WVp2YjhwRHQxd0s1UEZJVGRZK1Byb2RzTGtrSm9uaDEvZ0FOQ2R6bHU2cEh6K3pnQllnTGloWldocXovcUdOK21YRnhYcm56UjZ4UnBPdU5wbHYwdTUyWFFCb0pVbXhxVnZlekF6dFUxWDBBWEhUZ3N5Y1hHbmxkeC9QMWMxUUs4YUduSkxaaHB5WkhWMG1HNlZIOUFNZ1dETG1aVlZVcTFDb2R1N2VjeGRmZ0xnZXRiQ2dVTG1wOHBFOGw5UHA5N3BIcERlNmUrd1VtaDRHUUE4aW5qWWFxRmlKYk5mZXZZdjRCblNuYk1FaHRhUjB0ZWIrQjlibm90c2pTcVZVb3J4aGlnbVVWMFN5Um42NkFIeHJnYzNuODZITTdCejI1ZCs5c2ZqNWZmc0tWeTR0akdXRVRnZEFLVGNoSDB3TFZxMnQwQnc2Y21SNWZtNU90RXZrVWw0QlNTUnNYSmVLb0dzWExTOVJGU3hhR0cyTm1TWkNGUGJRaFBWUHBVS1dDTjVreURVb28vMDhBSEx6NWtGcGtyaXZ4RUppMmRYZE1SVGx4OTN3QW1OOGZUa3hLNDRySUppTSs3Uyt6bVc4MXVHTUJkQW9iKzZOaEIvRmdsN0RzaXc2VjNkbTRCYy8zOVBjYmpLYm8yeHFDSXBWbU40MDhJVklhQlBqWE1ocU5YdC8rOHIrOXBhV0ZzZEhqUmZhWW1qT0NZQnN2UDJTTENzU3NqdDVQRzVVWFgybys4US8vOUh6L2djZlg2YlFyQTBBOWZMMXBWbXBWQ3hFZHdJNHRiWHY5aDg3OXZ1T29TR1g1OVNwYzE5U2FyNFhBSmw0YzNjcHZ4NEVjYWExOWRMb2F3ZGZhdXMyZFE5VEJCTTBVeEFRckFWUjMxWW5ZbG1HcnpqamNnMk1Ienk0djcyaG9hSHZ3dy9yVzNsNGpDY0l5SWQxRFFVMlo5S09Dd3p0T09QemVkR2JmNmp1cWFsNXA2djJBK29ld3pWZzRndXVlTGJ3QVFpTjB3RUVjUWE4NXV5L1RqZ09IM3JWYUxQM2o5V2R2OVRPYzNqN2I1QVBBcnFJQXZ1QnFQN2lZamIyVEJyQWRGMXZjeC80OWZOZlhybHFIRGozMmVWclFsUW9LTER6N0E0Z21OTzlqaWhQM292RTBRT0M3dVFlRzBVSDl2K3k3ZVNKazEyTlh4aHZDSmhPWFNkTUVIZFR3VG5hZ0JnbThpNFdHTFlaOUxmamIxdXJYejlrZEEwT3VRV0dBL2JKblpHUzg0OU5LSEQyUW9YaVpEQnNYMnh1R1A3TmdWKzFXaXlXVzNYMXZNZVppV3dZNjdPSkFNRmhOTmpWc0lIYW83eis4ZW5HR2J2TjRuMTUvejVqdzZmbnJaK2NGeVRPaExNemlITXdMM1RmenI5UllJY1psVE5mN2pHUHorVWFSSEs1SW15YzhYcHZvK3JETDNVZXI2bnBQRnQvc1EzRjEwWUlnLy85ZUtHL09jbUxDbWc4VGFQR05pTTlyYWg0V1RwM2VqcFliYi8vWG8xOTc1NnE1cWFteisxMWpYSHBUcUgyTGdvNVh6WlJyZFNKQW9kd1k5N0VhZW16T29ZSEhheDZobEsrYUhHaEVqd0d1cFB4U3N2b3M3dDNmdkgzdng3dlBGMS9vYzFrN25Na0FCeW9TZDhNbllJSU44ckE2ZVNmMGNxTDF0OWZXcUNVU2tUWk9ka0t1ODAyMXRQYk8xemYxSG9kSlk0QmxGY1FaK3ZkVklEQXZvTjRXck5QUUR1TDllY0o0K1FrSHpvT3ZlUXJBTWRDM2hWRkNnaXEyVGNRajFPeUNXQ2o1QjNEbm1lZGFrTHJGZ25hOTZIVU9Dc1dPbUsvanRVMWFZNDJqWVpnYmJ1UGpHeE1pc0NCelFKSHNTNU5tY1JPczBGWUZZQ3pGWVVwQUFsR3JMZXh6azhyeTQrZzRXN2lUVXVUR0JKNHpoKzV4U2hOUUdDd3VSb3E2NklKeXBSRXR6RVNrSnNqK1ZBMHF3NndUQVNUU1hBbFJYcVN3SUVROFNyNWNSSGZnSUtqV3dNS1hJdzBCeVgrMVJUVkpJWkdiRFJlREU1RmIwV0plYm5KV3lod0VWUFVsb3JYNDhDVXhVbVVRTmZqY0EzZ1ZKQWFMaDRYTEgxRTVuTkdhRFhLNXhWZGtIMlhZczFIL0Y3UlpTVHhNQ211NkpySU1raGFzSVJNbzBoaWJPODJtWmFBZGF2UFVaSmU4amJacUFuWEJNS3BQdTQxZ2JCUUFGY0VTam1GTXVRdHcrai9yd21FU1MxWUt2Y0o5WVgvSThBQUpZdmZsdU9pK0pFQUFBQUFTVVZPUks1Q1lJST0iOwpmLmFwcGVuZENoaWxkKGMpO2UuZGF0YT1hO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD0ic3VibGluZSI7Yy5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImxhYmVsIj4nK2Euc3VibGluZSsiPC9kaXY+IjtlLmFwcGVuZENoaWxkKGMpO2UuYXBwZW5kQ2hpbGQoZik7dGhpcy5HLmFwcGVuZENoaWxkKGUpO3JldHVybiBlfTtTLnByb3RvdHlwZS5mYT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7QXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJpY29uLXBsYXkiKSkuZm9yRWFjaChmdW5jdGlvbihjKXt2YXIgZD1jLmdldEF0dHJpYnV0ZSgiZGF0YS1pZCIpO2QmJmMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChhLk4pO2cuai50cmFjaygidnJ0Y2x6cl9jaG9zZW4iLGEudS5nZXRQb3MoKSwhMCk7YS5VKCk7YS5KKCJ2aWRlb3N0YXJ0Iik7dmFyIGU9YS5CW2RdLGY9ZS52YXN0X2RhdGEsaD1lLmlkO2ZldGNoKGcuai5vKGUuc3JjLAohMCkpLnRoZW4oZnVuY3Rpb24oKXthLnBsYXllci5jKHtpZDpoLGFsaWFzOmEuYS5yY30pO3ZhciBtPWYuWmMoKTthLmEueGQ9bS5VYjthLnBsYXllci5zdGFydChtKX0pfSl9KX07Uy5wcm90b3R5cGUubWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMudT1uZXcgU3dpcGUodGhpcy5BLHtzdGFydFNsaWRlOjAsYXV0bzohMSxkcmFnZ2FibGU6ITEsYXV0b1Jlc3RhcnQ6ITEsY29udGludW91czohMCxkaXNhYmxlU2Nyb2xsOiEwLHN0b3BQcm9wYWdhdGlvbjohMCx0cmFuc2l0aW9uRW5kOmZ1bmN0aW9uKGMpe2EudGEoYyk7YS5ZfHwoYS5ZPSEwLGcuai50cmFjaygidnJ0Y2x6cl9hbmltYXRpb25maW5pc2hlZCIsIiIsITApKX19KTt0aGlzLmZhKCl9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpe3RoaXMuUChhKX07Uy5wcm90b3R5cGUuUD1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibGltb2J1dHRvbiIpO2MubGVuZ3RoJiYoQXJyYXkuZnJvbShjKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2QuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIil9KSwKY1thXS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKSl9O1MucHJvdG90eXBlLm9hPWZ1bmN0aW9uKGEpe3RoaXMubC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJsaW1vYnV0dG9uIilbYV0ucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJzdGFydCIpfTtTLnByb3RvdHlwZS5lYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLGQ9dGhpcy5sLmZpcnN0RWxlbWVudENoaWxkLGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKTtlLmNsYXNzTGlzdC5hZGQoInN0YXJ0Iik7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJsaW1vYnV0dG9uIik7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtjLnUuc2xpZGUoYSw1MCk7Yy5QKGEpfSk7ZS5hcHBlbmRDaGlsZChmKTtkLmFwcGVuZENoaWxkKGUpfTtTLnByb3RvdHlwZS5iYT1mdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiYm9keS1uby1zY3JvbGwiKTsKdGhpcy5KKCJjb21wbGV0ZSIpfTtTLnByb3RvdHlwZS5aPWZ1bmN0aW9uKCl7Zm9yKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiYm9keS1uby1zY3JvbGwiKTt0aGlzLmIuZmlyc3RDaGlsZDspdGhpcy5iLnJlbW92ZUNoaWxkKHRoaXMuYi5sYXN0Q2hpbGQpO3RoaXMuYiYmdGhpcy5iLnBhcmVudEVsZW1lbnQmJnRoaXMuYi5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuYik7dGhpcy5jb250YWluZXImJnRoaXMuY29udGFpbmVyLnBhcmVudEVsZW1lbnQmJnRoaXMuY29udGFpbmVyLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5jb250YWluZXIpO3JldHVybiBudWxsfTt5KGNhLHZhKTtjYS5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt0aGlzLk89YS5pZDt0aGlzLlA9YS5hbGlhc307Y2EucHJvdG90eXBlLnM9ZnVuY3Rpb24oKXt2YXIgYT1iYi5wb3AoKTthfHwoYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLGEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTsKcmV0dXJuIGF9O2NhLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihhKXt0aGlzLkEoYSl9O2NhLnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXM7RmMoZnVuY3Rpb24oZCl7Yy5hLnNyYz1hO2MuYS5sb2FkKCk7Yy5wbGF5KCk7ZC5hPTB9KX07Y2EucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuYS5zcmMmJnRoaXMuYS5wbGF5KCkuY2F0Y2goZnVuY3Rpb24oKXtnLmoudHJhY2soInZydGNsenJfcHJvbWlzZWZhaWx1cmUiLCIiLCEwKTthLnBhcmVudC5jbG9zZSgpO2EucGFyZW50LmEuSihhLnBhcmVudC5hLmV2ZW50Lk9hKX0pfTtjYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmEucGF1c2UoKX07Y2EucHJvdG90eXBlLmlzUGxheWluZz1mdW5jdGlvbigpe3JldHVybiAwPHRoaXMuYS5jdXJyZW50VGltZSYmIXRoaXMuYS5wYXVzZWR9O2NhLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmEucGF1c2VkfTsKY2EucHJvdG90eXBlLmViPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5tdXRlZH07Y2EucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7dGhpcy5hLm11dGVkPSEwfTtjYS5wcm90b3R5cGUuJGE9ZnVuY3Rpb24oKXt0aGlzLmEubXV0ZWQ9ITF9O2NhLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmEuY3VycmVudFRpbWV9O2NhLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmEuZHVyYXRpb259O2NhLnByb3RvdHlwZS5HPWZ1bmN0aW9uKCl7dGhpcy5hLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWQpO3RoaXMuYS5zZXRBdHRyaWJ1dGUoIndpZHRoIix0aGlzLmIud2lkdGgpO3RoaXMuYS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsdGhpcy5iLmhlaWdodCk7dGhpcy5hLnNldEF0dHJpYnV0ZSgicHJlbG9hZCIsdGhpcy5iLnByZWxvYWQpO3RoaXMuYS5zZXRBdHRyaWJ1dGUoIndlYmtpdC1wbGF5c2lubGluZSIsInRydWUiKTsKdGhpcy5hLnNldEF0dHJpYnV0ZSgicGxheXNpbmxpbmUiLCJ0cnVlIik7dGhpcy53Yi5hcHBlbmRDaGlsZCh0aGlzLmEpO3RoaXMuYS5yZW1vdmVBdHRyaWJ1dGUoImNvbnRyb2xzIil9O2NhLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7fTtjYS5wcm90b3R5cGUuSz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt9KTt0aGlzLmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLGZ1bmN0aW9uKCl7YS5pKCl9KTt0aGlzLmEuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYyl7dmFyIGQ9Yy5jdXJyZW50VGFyZ2V0O2MuY3VycmVudFRpbWU9ZC5jdXJyZW50VGltZTswPGQuZHVyYXRpb24mJmEuSigidGltZXVwZGF0ZSIsYyl9KTt0aGlzLmEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7YS5KKCJlcnJvciIpfSk7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoInBhdXNlIiwKZnVuY3Rpb24oKXt9KTt0aGlzLmEuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXthLkooInBsYXlpbmciKX0pfTt5KE5hLGNhKTtOYS5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oYSl7dGhpcy5qYT1hLmphO3RoaXMubD1hLmE7dGhpcy5mb3JtYXQ9YS5hWzBdLmZvcm1hdDtjYS5wcm90b3R5cGUuc3RhcnQuY2FsbCh0aGlzLGEuYVswXS51cmwpfTtOYS5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3RoaXMuYS5zdHlsZS5vYmplY3RGaXQ9ImNvdmVyIjt2YXIgYT10aGlzLmEub2Zmc2V0V2lkdGgvdGhpcy5hLm9mZnNldEhlaWdodDtpZigibGFuZHNjYXBlIj09PXRoaXMuZm9ybWF0fHwic3F1YXJlIj09PXRoaXMuZm9ybWF0KXRoaXMuYS5zdHlsZS5vYmplY3RGaXQ9LjU2MjU+YT8iY29udGFpbiI6ImNvdmVyIjsicG9ydHJhaXQiPT09dGhpcy5mb3JtYXQmJih0aGlzLmEuc3R5bGUub2JqZWN0Rml0PSJjb250YWluIil9O05hLnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dmFyIGE9CnRoaXM7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7MDxhLmEuZHVyYXRpb24mJmEuTihhLmEuY3VycmVudFRpbWUpfSk7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIixmdW5jdGlvbigpe2EudSgpfSl9O05hLnByb3RvdHlwZS5OPWZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTthIT09dGhpcy5mJiYoMD09PWEmJih0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxnLmoudHJhY2soInZydGNsenJfaW1wcmVzc2lvbiIsIiIsITApKSxhPT09TWF0aC5mbG9vcih0aGlzLmEuZHVyYXRpb24vNCkmJnRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxhPT09TWF0aC5mbG9vcih0aGlzLmEuZHVyYXRpb24vMikmJnRoaXMudHJhY2soIm1pZHBvaW50IiksYT09PU1hdGguZmxvb3IoMyp0aGlzLmEuZHVyYXRpb24vNCkmJnRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSwKdGhpcy5mPWEpfTtOYS5wcm90b3R5cGUudT1mdW5jdGlvbigpe2cuai50cmFjaygidnJ0Y2x6cl9lbmRlZCIsIiIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7dGhpcy5KKCJlbmRlZCIpO3RoaXMucGFyZW50LmEuWmEoImVuZGVkIix7fSl9O05hLnByb3RvdHlwZS50cmFjaz1mdW5jdGlvbihhKXt0aGlzLkIoYSkuZm9yRWFjaChmdW5jdGlvbihjKXt2YXIgZD17fTsiaW1wcmVzc2lvbiI9PT1hJiZjLmlkLmluY2x1ZGVzKCJIT01BRF8iKSYmKGQ9e2hvbWFkX2ltcF9wcmVmaXg6InZlcnRpY2FsaXpyLSJ9KTtmZXRjaChnLmoubyhjLnVybCwhMSxkKSl9KTt0aGlzLmphPXRoaXMubShhKX07TmEucHJvdG90eXBlLkI9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuamEuZmlsdGVyKGZ1bmN0aW9uKGMpe3JldHVybiBjLnR5cGU9PT1hfSl9O05hLnByb3RvdHlwZS5tPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmphLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4gYy50eXBlIT09YX0pfTtUYS5wcm90b3R5cGUuYj0KZnVuY3Rpb24oYSl7dGhpcy5qYT10aGlzLmphLmNvbmNhdChhKX07SWEucHJvdG90eXBlLkI9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMuQy5xdWVyeVNlbGVjdG9yKCJWQVNUQWRUYWdVUkkiKX07SWEucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjO3JldHVybiBGYyhmdW5jdGlvbihkKXtpZigxPT1kLmEpe2EuamE9YS5vKCk7YS5nPWEuRigpO2lmKCFhLkIoKSlyZXR1cm4gYS5iPWEubSgpLGEudSgpP2QucmV0dXJuKG5ldyBqYShhLmphLGEuYixhLmcsYS5DKSk6ZC5yZXR1cm4obmV3IFRhKC0xIT1hLmdldER1cmF0aW9uKCk/bmV3IEMoQy5mKTpuZXcgQyhDLmwpLHtDOmEuQ30pKTthLnM9bmV3IG5iKGEuQy5xdWVyeVNlbGVjdG9yKCJWQVNUQWRUYWdVUkkiKS50ZXh0Q29udGVudCk7cmV0dXJuIHFjKGQsYS5zLmxvYWQoKSwzKX1jPWQuYjtjLmIoYS5qYSk7cmV0dXJuIGQucmV0dXJuKGMpfSl9O0lhLnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7dmFyIGE9CnRoaXM7WyJOb25MaW5lYXJBZHMiLCJDb21wYW5pb24iXS5mb3JFYWNoKGZ1bmN0aW9uKGQpe0FycmF5LmZyb20oYS5DLnF1ZXJ5U2VsZWN0b3JBbGwoZCkpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfSl9KTt2YXIgYz1bXTsiSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZCl7QXJyYXkuZnJvbShhLkMucXVlcnlTZWxlY3RvckFsbChkKSkuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlKXt2YXIgZj1lLmdldEF0dHJpYnV0ZSgiaWQiKXx8ZC50b0xvd2VyQ2FzZSgpLGg9ZS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKSxtPWUuZ2V0QXR0cmlidXRlKCJvZmZzZXQiKXx8ZC50b0xvd2VyQ2FzZSgpO2MucHVzaCh7aWQ6Zix0eXBlOmgsdXJsOmUudGV4dENvbnRlbnQsCnJlcXVlc3Q6YS5pKGUudGV4dENvbnRlbnQpLG9mZnNldDptfSl9fSl9KTtyZXR1cm4gY307SWEucHJvdG90eXBlLkY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVmVyaWZpY2F0aW9ucyIpWzBdO3JldHVybltdLnNsaWNlLmNhbGwoYT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb24iKTpbXSl9O0lhLnByb3RvdHlwZS5tPWZ1bmN0aW9uKCl7dmFyIGE9W107QXJyYXkuZnJvbSh0aGlzLkMucXVlcnlTZWxlY3RvckFsbCgiTWVkaWFGaWxlIikpLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9e307QXJyYXkuZnJvbShjLmF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24oZSl7ZFtlLmxvY2FsTmFtZV09ZS52YWx1ZX0pO2QuZm9ybWF0PTEqZC53aWR0aD4xKmQuaGVpZ2h0PyJsYW5kc2NhcGUiOjEqZC53aWR0aD09MSpkLmhlaWdodD8ic3F1YXJlIjoicG9ydHJhaXQiO2QudXJsPWMudGV4dENvbnRlbnQ7YS5wdXNoKGQpfSk7cmV0dXJuIGF9OwpJYS5wcm90b3R5cGUudT1mdW5jdGlvbigpe3JldHVybiAxPHRoaXMuZ2V0RHVyYXRpb24oKX07SWEucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7dHJ5e3ZhciBhPUViKHRoaXMuQy5xdWVyeVNlbGVjdG9yKCJEdXJhdGlvbiIpLnRleHRDb250ZW50LnNwbGl0KCI6IikpLGM9YS5uZXh0KCkudmFsdWUsZD1hLm5leHQoKS52YWx1ZSxlPWEubmV4dCgpLnZhbHVlO3JldHVybiAzNjAwKitjKzYwKitkKyArZX1jYXRjaChmKXtyZXR1cm4tMX19O0lhLnByb3RvdHlwZS5pPWZ1bmN0aW9uKGEpe3JldHVybiBEYSYmImZ1bmN0aW9uIj09PXR5cGVvZiBEYS5vP0RhLm8oYSk6bmV3IFJlcXVlc3QoYSx7bWV0aG9kOiJHRVQifSl9O3kobmIsSWEpO25iLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjLGQsZSxmO3JldHVybiBGYyhmdW5jdGlvbihoKXtzd2l0Y2goaC5hKXtjYXNlIDE6cmV0dXJuIHFjKGgsYS5sKGEuc3JjKS5jYXRjaChmdW5jdGlvbihtKXt0aHJvdyBuZXcgVGEobmV3IEMoQy5iKSwKe2Vycm9yOm19KTt9KSwyKTtjYXNlIDI6cmV0dXJuIGM9aC5iLHFjKGgsYS5mKGMpLmNhdGNoKGZ1bmN0aW9uKG0pe3Rocm93IG5ldyBUYShuZXcgQyhDLmIpLHtlcnJvcjptLHJlc3BvbnNlOmN9KTt9KSwzKTtjYXNlIDM6cmV0dXJuIGQ9aC5iLGEuYT0obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGQsInRleHQveG1sIiksYS5DPWEuYS5xdWVyeVNlbGVjdG9yKCJBZCIpLGEuQz9xYyhoLGEucGFyc2UoKS5jYXRjaChmdW5jdGlvbihtKXt0aHJvdyBtO30pLDQpOihlPW5ldyBUYShuZXcgQyhDLmcpLGEuQyksZS5iKGEuYygpKSxoLnJldHVybihlKSk7Y2FzZSA0OnJldHVybiBmPWguYixoLnJldHVybihmKX19KX07bmIucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSl7cmV0dXJuIERhJiYiZnVuY3Rpb24iPT09dHlwZW9mIERhLmRhP0RhLmRhKGEpOmZldGNoKG5ldyBSZXF1ZXN0KGEse21ldGhvZDoiR0VUIn0pKX07bmIucHJvdG90eXBlLmY9ZnVuY3Rpb24oYSl7cmV0dXJuIEZjKGZ1bmN0aW9uKGMpe2lmKDEwPgpNYXRoLmFicyhhLnN0YXR1cy0yMDApJiZhLmJvZHkpcmV0dXJuIGMucmV0dXJuKGEudGV4dCgpLnRoZW4oZnVuY3Rpb24oZCl7cmV0dXJuIGR9KSk7bmV3IEMoQy5iLHtyZXNwb25zZTphfSk7Yy5hPTB9KX07bmIucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9W107QXJyYXkuZnJvbSh0aGlzLmEucXVlcnlTZWxlY3RvckFsbCgiRXJyb3IiKSkuZm9yRWFjaChmdW5jdGlvbihkKXtpZihkKXt2YXIgZT1kLmdldEF0dHJpYnV0ZSgiaWQiKXx8ZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2MucHVzaCh7aWQ6ZSx0eXBlOiJlcnJvciIsdXJsOmQudGV4dENvbnRlbnQscmVxdWVzdDphLmkoZC50ZXh0Q29udGVudCl9KX19KTtyZXR1cm4gY307eShXLHZhKTtXLnByb3RvdHlwZS5aYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmIuc2hpZnQoKX07Vy5wcm90b3R5cGUubG9hZD1mdW5jdGlvbihhKXt2YXIgYz10aGlzO3RoaXMuc3JjPWE7dGhpcy51KCkudGhlbihmdW5jdGlvbigpe2MuSigiY29tcGxldGUiLApjKX0pLmNhdGNoKGZ1bmN0aW9uKGQpe2MuSigiZXJyb3IiLGQpfSl9O1cucHJvdG90eXBlLmJhPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXM7cmV0dXJuIEZjKGZ1bmN0aW9uKGQpe3JldHVybiAxPT1kLmE/KGMuc3JjPWEscWMoZCxjLnUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGN9KS5jYXRjaChmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEMoQy5iLHtlcnJvcjplfSl9KSwyKSk6ZC5yZXR1cm4oZC5iKX0pfTtXLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhKXt2YXIgYz10aGlzO3JldHVybiBGYyhmdW5jdGlvbihkKXtyZXR1cm4gcWMoZCxjLkcoYSksMCl9KX07Vy5wcm90b3R5cGUudT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYyxkO3JldHVybiBGYyhmdW5jdGlvbihlKXtzd2l0Y2goZS5hKXtjYXNlIDE6cmV0dXJuIHFjKGUsYS5QKGEuc3JjKS5jYXRjaChmdW5jdGlvbihmKXt0aHJvdyBuZXcgQyhDLmIsZik7fSksMik7Y2FzZSAyOnJldHVybiBjPWUuYixxYyhlLGEuTyhjKS5jYXRjaChmdW5jdGlvbigpe3Rocm93IG5ldyBDKEMuYiwKe3Jlc3BvbnNlOmN9KTt9KSwzKTtjYXNlIDM6cmV0dXJuIGQ9ZS5iLHFjKGUsYS5HKGQpLDQpO2Nhc2UgNDplLmE9MH19KX07Vy5wcm90b3R5cGUuVT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5CKCkudGhlbihmdW5jdGlvbigpe2EuSigiY29tcGxldGUiLGEpfSkuY2F0Y2goZnVuY3Rpb24oYyl7YS5KKCJlcnJvciIsYyl9KX07Vy5wcm90b3R5cGUuUD1mdW5jdGlvbihhKXtyZXR1cm4gRGEmJiJmdW5jdGlvbiI9PT10eXBlb2YgRGEuZGE/RGEuZGEoYSx0aGlzLmRhKTpmZXRjaChuZXcgUmVxdWVzdChhLHttZXRob2Q6IkdFVCJ9KSl9O1cucHJvdG90eXBlLk89ZnVuY3Rpb24oYSl7aWYoMTA+TWF0aC5hYnMoYS5zdGF0dXMtMjAwKSlyZXR1cm4gYS50ZXh0KCkudGhlbihmdW5jdGlvbihjKXtyZXR1cm4gY30pO3Rocm93IG5ldyBDKEMuYix7cmVzcG9uc2U6YX0pO307Vy5wcm90b3R5cGUuRz1mdW5jdGlvbihhKXt2YXIgYz10aGlzLGQsZSxmO3JldHVybiBGYyhmdW5jdGlvbihoKXt0cnl7Yy5hPQoobmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIil9Y2F0Y2gobSl7dGhyb3cgbmV3IEMoQy5vLHtlcnJvcjptLHJlc3VsdDphfSk7fWQ9Yy5hLmZpcnN0Q2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtzd2l0Y2goZCl7Y2FzZSAidmFzdCI6Yy5NYT1BcnJheS5mcm9tKGMuYS5xdWVyeVNlbGVjdG9yQWxsKCJBZCIpKTtjLmM9MCE9PWMuYS5xdWVyeVNlbGVjdG9yQWxsKCJBZFtzZXF1ZW5jZV0iKS5sZW5ndGg7Yy5jJiYoYy5EPWMuYS5xdWVyeVNlbGVjdG9yQWxsKCJBZFtzZXF1ZW5jZV0iKS5sZW5ndGgpO2MubD0xPGMuTWEubGVuZ3RoJiYhYy5jO2JyZWFrO2Nhc2UgInZtYXA6dm1hcCI6Yy5ZPSEwO2MuZigicHJlcm9sbCIpO2MuZigibWlkcm9sbCIpO2MuZigicG9zdHJvbGwiKTtjLk1hLmxlbmd0aHx8Yy5mKCk7YnJlYWs7Y2FzZSAicGxheWxpc3QiOmMuVz0hMDtjLm0oIlByZXJvbGwiKTtjLm0oIk1pZHJvbGwiKTtjLm0oIlBvc3Ryb2xsIik7YnJlYWs7CmRlZmF1bHQ6dGhyb3cgZT1uZXcgQyhDLmcpLGMuaS5wdXNoKG5ldyBUYShlLHt2YXN0OmMuYX0pKSxlO31jLk1hLmxlbmd0aHx8KGY9bmV3IFRhKG5ldyBDKEMuZykse30pLGYuYihjLksoKSksYy5pLnB1c2goZikpO3JldHVybiBoLnJldHVybihjLkIoKSl9KX07Vy5wcm90b3R5cGUuQj1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYyxkLGU7cmV0dXJuIEZjKGZ1bmN0aW9uKGYpe2lmKDE9PWYuYSl7aWYoIShhLmIubGVuZ3RoPGEuRCYmYS5NYS5sZW5ndGgpKXtmLmE9MztyZXR1cm59Yz1hLlo7ZD1jLnB1c2g7cmV0dXJuIHFjKGYsYS5TKGEuTWEuc2hpZnQoKSksNCl9aWYoMyE9Zi5hKWQuY2FsbChjLGYuYiksZi5hPTE7ZWxzZXtpZihhLnljKXJldHVybiBmLnJldHVybihhKTtlPW5ldyBDKEMuYyx7ZGV0YWlsczpDLmEuT2R9KTthLiRjKCkmJihlPW5ldyBDKEMuYyx7ZGV0YWlsczpDLmEubmR9KSk7YS5pLnB1c2gobmV3IFRhKGUse3Zhc3Q6YS5hfSkpO3Rocm93IGU7fX0pfTtXLnByb3RvdHlwZS4kYz0KZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5iLmxlbmd0aDtjKyspdGhpcy5iW2NdLiRjKCkmJihhPSEwKTtyZXR1cm4gYX07Vy5wcm90b3R5cGUuUz1mdW5jdGlvbihhKXt2YXIgYz10aGlzLGQsZTtyZXR1cm4gRmMoZnVuY3Rpb24oZil7aWYoMT09Zi5hKXJldHVybiBkPW5ldyBJYShhLGEuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpKSxxYyhmLGQucGFyc2UoKS5jYXRjaChmdW5jdGlvbihoKXtyZXR1cm4gaH0pLDIpO2U9Zi5iO2UgaW5zdGFuY2VvZiBqYT9jLmIucHVzaChlKTplIGluc3RhbmNlb2YgVGEmJmMuaS5wdXNoKGUpO3JldHVybiBmLnJldHVybihkKX0pfTtXLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXM7KGE/QXJyYXkuZnJvbSh0aGlzLmEucXVlcnlTZWxlY3RvckFsbCgnQWRCcmVha1ticmVha0lkPSInK2ErJyJdJykpOkFycmF5LmZyb20odGhpcy5hLnF1ZXJ5U2VsZWN0b3JBbGwoIkFkQnJlYWsiKSkpLmZvckVhY2goZnVuY3Rpb24oZCwKZSl7dmFyIGY9ZC5xdWVyeVNlbGVjdG9yKCJWQVNUQWREYXRhIik7KGQ9ZC5xdWVyeVNlbGVjdG9yKCJBZFRhZ1VSSSIpKT8oZT1jLnMoZC50ZXh0Q29udGVudCxlKSxhJiZlLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLGEpLGMuTWEucHVzaChlKSk6ZiYmQXJyYXkuZnJvbShmLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKS5mb3JFYWNoKGZ1bmN0aW9uKGgpe2EmJmguc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsYSk7Yy5NYS5wdXNoKGgpfSl9KX07Vy5wcm90b3R5cGUubT1mdW5jdGlvbihhKXt2YXIgYz10aGlzO0FycmF5LmZyb20odGhpcy5hLnF1ZXJ5U2VsZWN0b3JBbGwoYSkpLmZvckVhY2goZnVuY3Rpb24oZCxlKXtpZihkPWQucXVlcnlTZWxlY3RvcigiQWQiKSllPWMucyhkLnRleHRDb250ZW50LGUpLGUuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsYSksYy5NYS5wdXNoKGUpfSl9O1cucHJvdG90eXBlLks9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9W107QXJyYXkuZnJvbSh0aGlzLmEucXVlcnlTZWxlY3RvckFsbCgiRXJyb3IiKSkuZm9yRWFjaChmdW5jdGlvbihkKXtpZihkKXt2YXIgZT0KZC5nZXRBdHRyaWJ1dGUoImlkIil8fGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtjLnB1c2goe2lkOmUsdHlwZToiZXJyb3IiLHVybDpkLnRleHRDb250ZW50LHJlcXVlc3Q6YS5OKGQudGV4dENvbnRlbnQpfSl9fSk7cmV0dXJuIGN9O1cucHJvdG90eXBlLk49ZnVuY3Rpb24oYSl7cmV0dXJuIERhJiYiZnVuY3Rpb24iPT09dHlwZW9mIERhLm8/RGEubyhhKTpuZXcgUmVxdWVzdChhLHttZXRob2Q6IkdFVCJ9KX07Vy5wcm90b3R5cGUucz1mdW5jdGlvbihhLGMpe2E9Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PFZBU1QgdmVyc2lvbj0iNC4wIj48QWQgc2VxdWVuY2U9IltTRVFVRU5DRV0iPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbW1VSSV1dXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD48L1ZBU1Q+Jy5yZXBsYWNlKCJbU0VRVUVOQ0VdIixjLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltVUkldIixhKTtyZXR1cm4obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsCiJ0ZXh0L3htbCIpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkfTtRYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXLnByb3RvdHlwZSx7eWM6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuYi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIWEuZ2UoKX0pLmxlbmd0aH19LEE6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTWEubGVuZ3RofX19KTtqYS5wcm90b3R5cGUuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuYS5sZW5ndGh9O2phLnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztyZXR1cm4gMDx0aGlzLmEuZmlsdGVyKGZ1bmN0aW9uKGMpe3JldHVybiBhLmMuaW5jbHVkZXMoYy50eXBlKX0pLmxlbmd0aH07amEucHJvdG90eXBlLnM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiB0aGlzLmEuZmlsdGVyKGZ1bmN0aW9uKGMpe3JldHVybiBhLmMuaW5jbHVkZXMoYy50eXBlKX0pWzBdfTsKamEucHJvdG90eXBlLmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2N9O2phLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztyZXR1cm4gdGhpcy5hLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4hYS5jLmluY2x1ZGVzKGMudHlwZSl9KVswXX07amEucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5qYT10aGlzLmphLmNvbmNhdChhKX07amEucHJvdG90eXBlLiRjPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DLnF1ZXJ5U2VsZWN0b3JBbGwoIk1lenphbmluZSIpLGM9ITE7YSYmYS5sZW5ndGgmJihjPSEwKTtyZXR1cm4gY307amEucHJvdG90eXBlLm89ZnVuY3Rpb24oKXt0cnl7dmFyIGE9RWIodGhpcy5DLnF1ZXJ5U2VsZWN0b3IoIkR1cmF0aW9uIikudGV4dENvbnRlbnQuc3BsaXQoIjoiKSksYz1hLm5leHQoKS52YWx1ZSxkPWEubmV4dCgpLnZhbHVlLGU9YS5uZXh0KCkudmFsdWU7cmV0dXJuIDM2MDAqK2MrNjAqK2QrICtlfWNhdGNoKGYpe3JldHVybi0xfX07amEucHJvdG90eXBlLkY9CmZ1bmN0aW9uKCl7dmFyIGE9MCxjPSExO3RyeXtjPXRoaXMuQy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxhPWcuai5aYihjLHRoaXMuZHVyYXRpb24pLDA+YSYmKGE9MCl9Y2F0Y2goZCl7YT0wfXJldHVybiBhfTtqYS5wcm90b3R5cGUubD1mdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLkMucXVlcnlTZWxlY3RvcigiQWRQYXJhbWV0ZXJzIik7cmV0dXJuIGE/YS50ZXh0Q29udGVudDoiIn1jYXRjaChjKXtyZXR1cm4iIn19O2phLnByb3RvdHlwZS5tPWZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMuQy5xdWVyeVNlbGVjdG9yKCJDbGlja1Rocm91Z2giKTtyZXR1cm4gYT9hLnRleHRDb250ZW50OiIifWNhdGNoKGMpe3JldHVybiIifX07amEucHJvdG90eXBlLkI9ZnVuY3Rpb24oKXt0cnl7aWYoIXRoaXMuZylmb3IodmFyIGE9dGhpcy5DLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGM9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYKMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5nPWFbZF0pO3JldHVybiB0aGlzLmd9Y2F0Y2goZSl7cmV0dXJuIiJ9fTtqYS5wcm90b3R5cGUuQWQ9ZnVuY3Rpb24oKXt0cnl7aWYodGhpcy5pKXJldHVybiB0aGlzLmk7dmFyIGE9IiIsYz10aGlzLkIoKTtjJiZjLmdldEF0dHJpYnV0ZT8oYT1jLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5pPWF9Y2F0Y2goZCl7cmV0dXJuIiJ9fTt5KEMsRXJyb3IpO0Mubz17dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix2YToiWE1MX1BBUlNFX0VSUk9SIn07Qy5sPXt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix2YToiRFVSQVRJT05fRVJST1IifTtDLmc9e3R5cGU6ImVycm9yIiwKY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIix2YToiRU1QVFlfVkFTVCJ9O0MuQj17dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix2YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn07Qy5iPXt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLAp2YToiTE9BRF9FUlJPUiJ9O0MuaT17dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsdmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifTtDLm09e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsdmE6Ik1FRElBRklMRV9FUlJPUiJ9O0MuZj17dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix2YToiRFVNTVlfQUQifTtDLkY9e3R5cGU6ImVycm9yIixjb2RlOi0xLG1lc3NhZ2U6InVua25vd24iLHZhOiJ1bmtub3duIn07Qy5jPXt0eXBlOiJlcnJvciIsY29kZTo1NTUsbWVzc2FnZToibm8gcGxheWFibGUgYWRzIix2YToiTk9fUExBWUFCTEVfQURTIn07Qy5hPXtPZDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix2YToiTk9fQURTIn0sUWQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHZhOiJOT19NRURJQUZJTEVTIn0sbmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsdmE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix2YToiVlBBSURfSUdOT1JFRCJ9LG5kOnt0eXBlOiJlcnJvciIsY29kZTozMDM1LG1lc3NhZ2U6Im9ubHkgbWV6emFuaW5lIix2YToiT05MWV9NRVpaQU5JTkUifSxQZDp7dHlwZToiaGludCIsY29kZTotMSxtZXNzYWdlOiJubyBkZXRhaWwiLHZhOiJubyBkZXRhaWwifX07aWEucHJvdG90eXBlLnU9ZnVuY3Rpb24oYSl7dmFyIGM9ITEsZD0wLGU9MDthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKYz0iZml4ZWQiLGQ9YS5sZWZ0LGU9YS50b3ApO2Q9e3g6ZCx5OmV9O2QucG9zaXRpb249YztyZXR1cm4gZH07aWEucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKGEpe2lmKHRoaXMubC51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMudShhKTtmb3IodmFyIGM9MCxkPTAsZT0hMSxmPXRoaXMuQShhKTthOyljKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZiYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxjKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCwKZCs9YSx0aGlzLmwucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmwucG9zaXRpb25JZkZpeGVkKSk7Yz17eDpjLHk6ZH07ZSYmKGMucG9zaXRpb249ZSk7cmV0dXJuIGN9O2lhLnByb3RvdHlwZS5LPWZ1bmN0aW9uKCl7dGhpcy5CPSEwfTtpYS5wcm90b3R5cGUuRD1mdW5jdGlvbigpe3RoaXMuVC5wYXVzZSgpO2wuYSh2LmIsdGhpcy5ULkNhKCkpfTtpYS5wcm90b3R5cGUuRz1mdW5jdGlvbigpe3RoaXMuQnx8KHRoaXMuVC5wbGF5KCksbC5hKHYuZyx0aGlzLlQuQ2EoKSkpfTtpYS5wcm90b3R5cGUuTT1mdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7Zy52LmIoInpJbmRleCIpJiYoYT1nLnYuYigiekluZGV4IikpO3RoaXMuVC5wYXVzZSgpO3RoaXMuYS5zdHlsZS56SW5kZXg9YTt0aGlzLmEuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5hLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLmEuc3R5bGUuYm94U2l6aW5nPXRoaXMuVmEuc3R5bGUuYm94U2l6aW5nO3RoaXMubT8KdGhpcy5hLnN0eWxlLmJhY2tncm91bmQ9InJnYmEoMCwgMCwgMCwgLjc1KSI6KHRoaXMuYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiLHRoaXMuYS5zdHlsZS53aWR0aD10aGlzLlZhLm9mZnNldFdpZHRoKzArInB4Iix0aGlzLmEuc3R5bGUuaGVpZ2h0PXRoaXMuVmEub2Zmc2V0SGVpZ2h0KzArInB4Iix0aGlzLkYodGhpcy5WYS5vZmZzZXRXaWR0aCswLHRoaXMuVmEub2Zmc2V0SGVpZ2h0KzApKTt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVmEpO3RoaXMuVC5XYiYmdGhpcy5ULldiKCk/dGhpcy5ULnhhKCkuYXBwZW5kQ2hpbGQodGhpcy5hKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuYSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5vLmJpbmQodGhpcyksMTApfTtpYS5wcm90b3R5cGUuZXhpdEZ1bGxzY3JlZW49ZnVuY3Rpb24oKXt0aGlzLlQuZXhpdEZ1bGxzY3JlZW4oKX07aWEucHJvdG90eXBlLkE9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLApkPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YyYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtkPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfTtpYS5wcm90b3R5cGUucz1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7aWYodGhpcy5tKXt2YXIgZD13aW5kb3c7Yz1kb2N1bWVudDt2YXIgZT1jLmRvY3VtZW50RWxlbWVudCxmPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTthPWQuaW5uZXJXaWR0aHx8ZS5jbGllbnRXaWR0aHx8Zi5jbGllbnRXaWR0aDtkPWQuaW5uZXJIZWlnaHR8fGUuY2xpZW50SGVpZ2h0fHxmLmNsaWVudEhlaWdodDtjPWMuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKYz17cG9zaXRpb246ImFic29sdXRlIix4OjAseTpNYXRoLmFicyhjLnkpLHdpZHRoOmEsaGVpZ2h0OmR9fXJldHVybiBjfTtpYS5wcm90b3R5cGUubz1mdW5jdGlvbihhKXt0aGlzLlQuRWQmJmcuai5jYSh0aGlzLlQuY29udGFpbmVyKSYmKHRoaXMuVC5FZCgpLHRoaXMuVmE9dGhpcy5ULmNvbnRhaW5lcixhPSEwKTt2YXIgYz10aGlzLnModGhpcy5WYSk7aWYoYy54IT10aGlzLmIueHx8Yy55IT10aGlzLmIueXx8Yy5wb3NpdGlvbiE9dGhpcy5iLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLmIud2lkdGh8fGMuaGVpZ2h0IT10aGlzLmIuaGVpZ2h0fHxhfHxnLmouYigic3BpZWdlbCIpJiYuNT5NYXRoLnJhbmRvbSgpKXtpZigwPHRoaXMuYi53aWR0aCYmMDx0aGlzLmIuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5jKCk7cmV0dXJufXRoaXMuYj1jO3RoaXMuVC5XYigpPyh0aGlzLmEuc3R5bGUubGVmdD0iMHB4Iix0aGlzLmEuc3R5bGUudG9wPSIwcHgiKToodGhpcy5hLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuYS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuYS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5hLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuYS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuRihjLndpZHRoLGMuaGVpZ2h0KX1sLmNhKHRoaXMuYSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDEwKX07aWEucHJvdG90eXBlLlZjPWZ1bmN0aW9uKGEpe3RoaXMubT1hfTtpYS5wcm90b3R5cGUuRj1mdW5jdGlvbihhLGMpe2Zvcih2YXIgZD0wO2Q8dGhpcy5pLmxlbmd0aDtkKyspdGhpcy5pW2RdKHt3aWR0aDphLGhlaWdodDpjfSl9O2lhLnByb3RvdHlwZS5ZYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9O2lhLnByb3RvdHlwZS5nPWZ1bmN0aW9uKGEpe3RoaXMuaXx8KHRoaXMuaT1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuaS5wdXNoKGEpfTtpYS5wcm90b3R5cGUuYz1mdW5jdGlvbigpe3RoaXMuYSYmCnRoaXMuYS5wYXJlbnROb2RlJiZ0aGlzLmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5hLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5hKX07bWIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLmk9ITA7Zm9yKHZhciBhIGluIHRoaXMuYyl7aWYodGhpcy5nKWJyZWFrO3ZhciBjPXRoaXMuY1thXTt0aGlzLmwoYykmJih0aGlzLmIucHVzaChjKSx0aGlzLmYoYykpfX07bWIucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBGPyEwOiExfTttYi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXt0aGlzLmwoYSkmJmEudygpfTttYi5wcm90b3R5cGUubT1mdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgQSlmb3IoZy5UYz1hLHRoaXMuZz0hMCxhPTA7YTx0aGlzLmIubGVuZ3RoO2ErKyl0aGlzLmJbYV0mJnRoaXMuYlthXS5sYyYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmJbYV0ubGMpfTttYi5wcm90b3R5cGUuYT1mdW5jdGlvbihhLApjKXtpZighdGhpcy5nfHxjKXRoaXMuYi5wdXNoKGEpLHRoaXMuZihhKX07dmFyIFQ9bmV3IG1iO1QudygpO0YucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt9O0YucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXt0aGlzLkY8PXRoaXMubD8odGhpcy5GKyssdGhpcy5sYz13aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwxMDApKTowPnRoaXMubCYmKHRoaXMubGM9d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMTAwKSl9O0YucHJvdG90eXBlLk09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GPnRoaXMubD8hMDohMX07Ri5wcm90b3R5cGUudT1mdW5jdGlvbigpe3RoaXMuRj0wfTtGLnByb3RvdHlwZS5hYT1mdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9O0YucHJvdG90eXBlLks9ZnVuY3Rpb24oYSl7dGhpcy5hPWF9O0YucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dGhpcy5mW2EueWEoKV09YTtUJiZULmkmJlQubShhKX07Ri5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXt2YXIgYz0KYS5SKCksZDtmb3IoZCBpbiB0aGlzLmYpaWYoYz09dGhpcy5mW2RdLlIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5mW2EueWEoKV0/ITA6ITF9O0YucHJvdG90eXBlLkc9ZnVuY3Rpb24oYSl7YT1hLnhhKCk7Zm9yKHZhciBjIGluIHRoaXMuZil0cnl7dmFyIGQ9dGhpcy5mW2NdLnhhKCk7aWYoYS5pZD09KGQ/ZC5pZDoiIikpcmV0dXJuITB9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSl9cmV0dXJuITF9O0EucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In07QS5wcm90b3R5cGUuQ2E9ZnVuY3Rpb24oKXt2YXIgYT17fSxjPXRoaXMuUigpLGQ9dGhpcy54YSgpLGU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWMpYS52aWRlb1RhZ0lkPWMuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfTtBLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7fTtBLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe307QS5wcm90b3R5cGUuSWU9CmZ1bmN0aW9uKGEpe3RoaXMuYz1hfTtBLnByb3RvdHlwZS5IZT1mdW5jdGlvbihhKXt0aGlzLkY9YX07QS5wcm90b3R5cGUuY2Q9ZnVuY3Rpb24oKXt9O0EucHJvdG90eXBlLmlzRnVsbHNjcmVlbj1mdW5jdGlvbigpe3JldHVybiExfTtBLnByb3RvdHlwZS5leGl0RnVsbHNjcmVlbj1mdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpLmNhdGNoKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGEpe319O0EucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9OwpBLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX07QS5wcm90b3R5cGUueWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH07QS5wcm90b3R5cGUubz1mdW5jdGlvbihhKXt0aGlzLmlkPWF9O0EucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7YSYmKHRoaXMudmlkZW9UYWc9YSx0aGlzLkQoKXx8dGhpcy5BKCksdGhpcy5vKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKSl9O0EucHJvdG90eXBlLlI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ307QS5wcm90b3R5cGUuQT1mdW5jdGlvbigpe3ZhciBhPWwuZygxMCk7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixhKX07QS5wcm90b3R5cGUuRD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlIoKS5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9O0EucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9YX07QS5wcm90b3R5cGUueGE9ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09CnR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfTtBLnByb3RvdHlwZS5nZXRSYXdQbGF5ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9O0EucHJvdG90eXBlLmFkPWZ1bmN0aW9uKCl7cmV0dXJuITB9O0EucHJvdG90eXBlLmlzUGxheWluZz1mdW5jdGlvbigpe3JldHVybiEwfTtBLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO3JldHVybiBhJiZhLmN1cnJlbnRUaW1lP2EuY3VycmVudFRpbWU6MH07QS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlIoKTtyZXR1cm4gYSYmYS5kdXJhdGlvbj9hLmR1cmF0aW9uOjB9O0EucHJvdG90eXBlLkhhPWZ1bmN0aW9uKCl7cmV0dXJuITF9O0EucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXt0aGlzLmk9ITB9O0EucHJvdG90eXBlLldiPWZ1bmN0aW9uKCl7dmFyIGE9Zy52LmE7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPwohMDohMX07QS5wcm90b3R5cGUuRWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlIoKTtyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfTtBLnByb3RvdHlwZS5zZT1mdW5jdGlvbigpe3JldHVybiExfTtBLnByb3RvdHlwZS5rZD1mdW5jdGlvbihhKXt0aGlzLmhjPWF9O0EucHJvdG90eXBlLmZkPWZ1bmN0aW9uKCl7dGhpcy5oYz1udWxsfTtBLnByb3RvdHlwZS5YYz1mdW5jdGlvbigpe3JldHVybiExfTtFLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7fTtFLnByb3RvdHlwZS5iPWZ1bmN0aW9uKCl7dGhpcy5mYXx8KHRoaXMuZmE9ITAsbC5tYSgpKX07RS5wcm90b3R5cGUubmE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcixjPW5ldyBDYTt3aW5kb3dbYy5hKCldfHwod2luZG93W2MuYSgpXT17fSk7d2luZG93W2MuYSgpXVthLnlhKCldfHwod2luZG93W2MuYSgpXVthLnlhKCldPXt9LHdpbmRvd1tjLmEoKV1bYS55YSgpXS5pbml0aWF0b3I9bC5EKCkpO3dpbmRvd1tjLmEoKV1bYS55YSgpXVtsLkQoKV0/CndpbmRvd1tjLmEoKV1bYS55YSgpXVtsLkQoKV0rKzp3aW5kb3dbYy5hKCldW2EueWEoKV1bbC5EKCldPTF9O0UucHJvdG90eXBlLnBhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYz0hMCxkPW5ldyBDYTt3aW5kb3dbZC5hKCldJiZ3aW5kb3dbZC5hKCldW2EueWEoKV0mJndpbmRvd1tkLmEoKV1bYS55YSgpXS5pbml0aWF0b3IhPWwuRCgpJiYodGhpcy5VKCksYz0hMSk7cmV0dXJuIGN9O0UucHJvdG90eXBlLmE9ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMDthJiYoZD0hMSk7dGhpcy5pKCl8fCh0aGlzLm5hKCksdGhpcy5wYSgpPyh0aGlzLlUoKSx0aGlzLlcodGhpcy5wbGF5ZXIsZCksdGhpcy5oYSgpLGMmJiJmdW5jdGlvbiI9PXR5cGVvZiBjJiZjKCkpOihsLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCksdGhpcy5VKCkpKX07RS5wcm90b3R5cGUuST1mdW5jdGlvbihhLGMpe3RoaXMuaSgpfHwodGhpcy5tLnB1c2goYSksdGhpcy5sLnB1c2goe3JlYXNvbjphLApkZXRhaWw6Y30pKX07RS5wcm90b3R5cGUuaGE9ZnVuY3Rpb24oKXt2YXIgYT0idW5rbm93biIsYz1bXTt0aGlzLm0mJjA8dGhpcy5tLmxlbmd0aCYmKHRoaXMubT1sLnVuaXF1ZSh0aGlzLm0pLGwudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLm0uam9pbigiLCIpKSk7aWYodGhpcy5sKXtmb3IodmFyIGQ9MDtkPHRoaXMubC5sZW5ndGg7ZCsrKXRoaXMuQlt0aGlzLmxbZF0ucmVhc29uXT09dGhpcy5CW2FdJiZjLnB1c2godGhpcy5sW2RdLmRldGFpbCksdGhpcy5CW3RoaXMubFtkXS5yZWFzb25dPHRoaXMuQlthXSYmKGM9W10sYy5wdXNoKHRoaXMubFtkXS5kZXRhaWwpLGE9dGhpcy5sW2RdLnJlYXNvbik7dGhpcy5CW2FdfHwoYT0idW5rbm93biIsYz1bXSk7MDxjLmxlbmd0aCYmKGM9bC51bmlxdWUoYyksYT1hKyItIitjLmpvaW4oIi0iKSk7bC50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX19O0UucHJvdG90eXBlLkw9ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLll9OwpFLnByb3RvdHlwZS5VPWZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYX07RS5wcm90b3R5cGUuemE9ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmthfTtFLnByb3RvdHlwZS5nPWZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5GfTtFLnByb3RvdHlwZS5iYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5ZfTtFLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLkZ9O0UucHJvdG90eXBlLmdhPWZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWF9O0UucHJvdG90eXBlLndhPWZ1bmN0aW9uKGEpe3RoaXMuVz1hfTt5KGxiLEEpO2xiLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLmIoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuZyhhKTt0aGlzLkxhPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkxhPQohMH0uYmluZCh0aGlzKSl9O2xiLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX07bGIucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX07bGIucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9O3koTGIsRSk7TGIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSxjPWEubGY7Yz9jLklhP2MuSWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oZCl7dmFyIGU9ITEsZj0iIjtkLmdldEVycm9yJiYoZT1kLmdldEVycm9yKCkpO2V8fGQuZGV0YWlsLmdldEVycm9yJiYoZT1kLmRldGFpbC5nZXRFcnJvcigpKTtlLmdldEVycm9yQ29kZSYmKGYrPWUuZ2V0RXJyb3JDb2RlKCkpO2UuZ2V0TWVzc2FnZSYmKGYrPWUuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9CmYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLkwoKSx0aGlzLmIoKSk6KHRoaXMuSSgiYWRlcnJvciIpLHRoaXMuYygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5JKCJmcmFtZXdvcmsiKSx0aGlzLmMoKSl9O0xiLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuTGE/dGhpcy5hKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMCl9O3koaWMsRik7aWMucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbGIod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTsKdGhpcy5iKGEpfHwodGhpcy5pKGEpLChuZXcgTGIoYSx0aGlzLmEpKS53KCkpfXRoaXMuZygpfTt2YXIgTGM9bmV3IGljKFgpO1QuYShMYyk7eShsYSxBKTtsYS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3ZhciBhPWwuYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmMDw9YS5hdXRob3JpdHkuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYodGhpcy5mPSEwKTt0aGlzLlVjKCk7dGhpcy52YygpO2E9ITA7dGhpcy5wbGF5ZXIuZ2V0Q29uZmlnJiYoYT10aGlzLnBsYXllci5nZXRDb25maWcoKSk7YXx8KHRoaXMuVGE9ITApfTtsYS5wcm90b3R5cGUuVWM9ZnVuY3Rpb24oKXt0aGlzLlRhPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5UYT0hMCk7IWEubm9kZU5hbWV8fCJPQkpFQ1QiIT1hLm5vZGVOYW1lJiYiVklERU8iIT1hLm5vZGVOYW1lfHwoYT1hLnBhcmVudE5vZGUpO3RoaXMubD0KYTtpZih0aGlzLmYpe3RoaXMudmMoKTtpZih0aGlzLlRhKXJldHVybjthPXRoaXMuUigpLnBhcmVudE5vZGUucGFyZW50Tm9kZX10aGlzLmIoYSl9O2xhLnByb3RvdHlwZS52Yz1mdW5jdGlvbigpe2lmKCF0aGlzLlRhKXt2YXIgYT10aGlzLmwsYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjfHwodGhpcy5UYT0hMCk7dGhpcy5nKGMpO2cudi5iKCJ1c2VfdmlkZW90YWdfYXNfY29udGFpbmVyIikmJnRoaXMuYihjKX19O2xhLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKGcudi5iKCJwb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQiKSlhLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuYyYmKDAsdGhpcy5jKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihhLl9ldmVudHMmJgphLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihjKXtjLmR1cmF0aW9uJiZjLnBvc2l0aW9uJiYxPmMuZHVyYXRpb24tYy5wb3NpdGlvbiYmdGhpcy5jJiYoMCx0aGlzLmMpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihjKXtjLmR1cmF0aW9uJiZjLnBvc2l0aW9uJiYxPmMuZHVyYXRpb24tYy5wb3NpdGlvbiYmdGhpcy5jJiYoMCx0aGlzLmMpKCl9LmJpbmQodGhpcykpfTtsYS5wcm90b3R5cGUuRWQ9ZnVuY3Rpb24oKXt0aGlzLlVjKCk7dGhpcy52YygpfTtsYS5wcm90b3R5cGUuY2Q9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYyl7dGhpcy5tKGMpfS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYyl7dGhpcy5tKGMpfS5iaW5kKHRoaXMpKX07CmxhLnByb3RvdHlwZS5tPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGxheWVyO2MuZ2V0UG9zaXRpb24oKTtjLmdldFBvc2l0aW9uKCk7Yy5nZXREdXJhdGlvbigpO2MuZ2V0UG9zaXRpb24oKTtjLmdldER1cmF0aW9uKCk7Yy5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmMuZ2V0UG9zaXRpb24mJjMwPGMuZ2V0UG9zaXRpb24oKSYmMzA8Yy5nZXREdXJhdGlvbigpLWMuZ2V0UG9zaXRpb24oKSYmdGhpcy5GJiYoMCx0aGlzLkYpKCl9O2xhLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLlIoKS5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX07bGEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7cmV0dXJuIGEuZ2V0U3RhdGUmJiJwYXVzZWQiPT1hLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfTsKbGEucHJvdG90eXBlLkhhPWZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH07bGEucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn07bGEucHJvdG90eXBlLmV4aXRGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9O2xhLnByb3RvdHlwZS5FYT1mdW5jdGlvbigpe3ZhciBhPSExLGM9dGhpcy5wbGF5ZXI7Yy5nZXRNdXRlJiZjLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfTtsYS5wcm90b3R5cGUuWGM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcixjPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYz1hLmdldFZvbHVtZSgpKTtyZXR1cm4gY307eShmYixFKTtmYi5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3RoaXMuUz0iYWRDbGljayBhZENvbXBsZXRlIGFkRXJyb3IgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFJlcXVlc3QgYWRTa2lwcGVkIGFkVGltZSBiZWZvcmVDb21wbGV0ZSBiZWZvcmVQbGF5IGMgY2FzdCBjb21wbGV0ZSBlbSBmaXJzdEZyYW1lIGwgaWRsZSBsZXZlbHMgbWV0YSBwbGF5IHBsYXlsaXN0Q29tcGxldGUgcmVhZHkgcmVzaXplIHNlZWsgc2ggdGltZSIuc3BsaXQoIiAiKX07CmZiLnByb3RvdHlwZS5nPWZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5GO3RoaXMuaXNQbGF5aW5nPXRoaXMuSz10aGlzLmNhPSExO3RoaXMuRz0xO3RoaXMuTj0wO3RoaXMucz1bXTt0aGlzLmY9ITF9O2ZiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO2cuai5iKCJzcGllZ2VsLmRlIikmJmcuai5zYSgpLnRoZW4oZnVuY3Rpb24oZil7ZiYmKGEuUD0hMCxhLm98fGMucGx1Z2lucy52YXN0LmRlc3Ryb3koKSxsLnRyYWNrKCJzdGF0c19oZF90YWtlb3ZlciIsIWEubywhMCkpfSkuY2F0Y2goZnVuY3Rpb24oKXt9KTstMSE9PXdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoInZlcnRpY2FsaXpyIikmJi0xIT09d2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiJmZvcmNlIikmJmMucGx1Z2lucy52YXN0LmRlc3Ryb3koKTtpZihnLmouTWIoKSYmZy5qLk0oKSl7dmFyIGQ9ZnVuY3Rpb24oKXt0aGlzLm8/Zy5qLnRyYWNrKCJ2cnRjbHpyX3Rha2VvdmVyIiwKITEsITApOihnLmoudHJhY2soInZydGNsenJfdGFrZW92ZXIiLCEwLCEwKSxjLnBsdWdpbnMudmFzdC5kZXN0cm95KCksZy5DYz10aGlzLkNjLGMub24oInBsYXkiLGZ1bmN0aW9uKCl7Yy5tdXRlZEF1dG9zdGFydHx8dGhpcy5EfHwoZy5qLnRyYWNrKCJ2cnRjbHpyX2RlbGl2ZXIiLCJwbGF5IiwhMCksdGhpcy5jKCksdGhpcy5EPSEwKX0uYmluZCh0aGlzKSksYy5vbigibXV0ZSIsZnVuY3Rpb24oZil7IWMubXV0ZWRBdXRvc3RhcnR8fGYubXV0ZXx8dGhpcy5EfHwoZy5qLnRyYWNrKCJ2cnRjbHpyX2RlbGl2ZXIiLCJtdXRlIiwhMCksdGhpcy5jKCksdGhpcy5EPSEwKX0uYmluZCh0aGlzKSkpfS5iaW5kKHRoaXMpO3RoaXMuQ2M9bmV3IFIoZCl9ZWxzZXt2YXIgZT17fTtpZihjLmdldENvbmZpZylpZihlPWMuZ2V0Q29uZmlnKCksZS5hZHZlcnRpc2luZyl7aWYoZS5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihlLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyllLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgplLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5HPWUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5mPSEwKTtlbHNle2lmKGUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IoZD0wO2Q8ZS5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7ZCsrKWlmKGUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbZF0udGFnKXt0aGlzLmY9ITA7YnJlYWt9ZS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZlLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5mPSEwKTtlLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmY9ITApfWUuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5mPSEwKX1lbHNlIHRoaXMuTCgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7ZT0iYWRQbGF5IGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIGFkQ29tcGxldGUiLnNwbGl0KCIgIik7CmZvcihkPTA7ZDxlLmxlbmd0aDtkKyspYy5vbihlW2RdLGZ1bmN0aW9uKGYpe3ZhciBoPXRoaXM7dGhpcy5vPSEwO3RoaXMuTChmLnR5cGUpOyJhZFBsYXkiPT09Zi50eXBlJiZnLmouYigic3BpZWdlbC5kZSIpJiZnLmouc2EoKS50aGVuKGZ1bmN0aW9uKG0pe20mJmcuai50cmFjaygic3RhdHNfaGRfdGFrZW92ZXJfY2MiLGguUCwhMCl9KS5jYXRjaChmdW5jdGlvbigpe30pOyJhZENvbXBsZXRlIj09PWYudHlwZSYmKHRoaXMuSz0hMCl9LmJpbmQodGhpcykpO2Mub24oImFkRXJyb3IiLGZ1bmN0aW9uKGYpe3RoaXMub25BZEVycm9yKGYpfS5iaW5kKHRoaXMpKTtjLm9uKCJ0aW1lIixmdW5jdGlvbihmKXt0aGlzLmlzUGxheWluZz0hMDszMDxmLmR1cmF0aW9uJiYhdGhpcy5pKCkmJiFjLm11dGVkQXV0b3N0YXJ0JiYodGhpcy5mPyh0aGlzLkkoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmMoKSk6KHRoaXMuSSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChldmVudC5kdXJhdGlvbi8KMUUzKSksdGhpcy5jKCEwKSkpfS5iaW5kKHRoaXMpKTtjLm9uKCJwbGF5bGlzdGl0ZW0iLGZ1bmN0aW9uKCl7aWYodGhpcy5pKCkmJih0aGlzLmcoKSx0aGlzLnBsYXllci55ZD0hMCxjb25mLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBmPXRoaXMucGxheWVyLmhjO2YmJihmLmtjKCksZi51YygpKX19LmJpbmQodGhpcykpfX07ZmIucHJvdG90eXBlLm9uQWRFcnJvcj1mdW5jdGlvbihhKXt0aGlzLk18fCh0aGlzLk09W10pO3RoaXMuTS5wdXNoKHtjb2RlOmEuY29kZSxtc2c6YS5tZXNzYWdlfSk7dGhpcy5OKys7dmFyIGM9YS50YWc7LTE9PXRoaXMucy5pbmRleE9mKGMpJiZ0aGlzLnMucHVzaChjKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT9sLlMoKT8obC51PSEwLHRoaXMuSSgiYWRlbXB0eSIsYS5jb2RlKSx0aGlzLmMoKSk6KHRoaXMuTCgpLHRoaXMuYigpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMuTCgiZW1wdHkiKToKMzAzPT1hLmNvZGUmJi0xIT1hLm1lc3NhZ2UuaW5kZXhPZigiZW1wdHkiKT90aGlzLkwoImVtcHR5Iik6KHRoaXMuSSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLnMubGVuZ3RoPj10aGlzLkcmJnRoaXMuYygpKX07ZmIucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7KGE9dm9pZCAwPT09YT8hMTphKT90aGlzLkE/dGhpcy5BKys6dGhpcy5BPTE6dGhpcy51P3RoaXMudSsrOnRoaXMudT0xO3ZhciBjPXRoaXMucGxheWVyO2lmKGwuY2EoYy5SKCkpKWlmKGMuVGEpdGhpcy5MKCJwbGF5ZXIgaXMgaW52YWxkIik7ZWxzZXt2YXIgZD1mdW5jdGlvbigpe3RoaXMudT50aGlzLkEmJihhPSExKTt0aGlzLmEoYSl9LmJpbmQodGhpcyk7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkub24oInRpbWUiLGZ1bmN0aW9uKGUpey41PmUucG9zaXRpb24mJiEoMD5lLnBvc2l0aW9uJiYwPmUuZHVyYXRpb24pfHx0aGlzLk98fCh0aGlzLk89ITAsZCgpKX0uYmluZCh0aGlzKSl9ZWxzZSBjLlVjKCksYy52YygpLApjLlRhfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYyhhKX0uYmluZCh0aGlzKSwyMCl9O3koQ2IsRik7Q2IucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dmFyIGM9Ri5wcm90b3R5cGUuYi5jYWxsKHRoaXMsYSk7YT1hLnBsYXllcjtpZighYyYmYSlmb3IodmFyIGQgaW4gdGhpcy5mKXRoaXMuZltkXS5wbGF5ZXI9PWEmJihjPSEwKTtyZXR1cm4gY307Q2IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT1sLmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuYygpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpOwppZigoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKSYmd2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKSl7YT1bXTtpZigxPGMubGVuZ3RoKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKWEucHVzaChjW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkPW5ldyBsYSh3aW5kb3cuandwbGF5ZXIoYVtjXSkpLG51bGw9PWQuaWQmJm51bGw9PWQuY29udGFpbmVyJiZudWxsPT1kLnZpZGVvVGFnfHxkLlRhfHx0aGlzLmIoZCl8fHRoaXMuRyhkKXx8KHRoaXMuaShkKSxkPW5ldyBmYihkLHRoaXMuYSksZC5WKCksZC53KCkpfXRoaXMuZygpfX07Q2IucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXt2YXIgYT1sLmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnJldHVybiBsLkEoYS5hbmNob3IpfTt2YXIgTWM9bmV3IENiKFgpO1QuYShNYyk7eShCYSxBKTtCYS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGM9YS5lbF87Y3x8KGM9YS5lbCgpKTtjPyh0aGlzLmIoYyksKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuZyhhKTp0aGlzLmEoKSk6dGhpcy5hKCl9ZWxzZSB0aGlzLmEoKX07QmEucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifTtCYS5wcm90b3R5cGUuTmE9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpKX07QmEucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGM9YS5jdXJyZW50VGltZSgpO2E9YS5kdXJhdGlvbigpOwpjJiYwPGMmJmEmJjA8YSYmYz49YS0yJiZ0aGlzLmMmJnRoaXMuYygpfTtCYS5wcm90b3R5cGUuYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlIoKS5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBjPUpTT04ucGFyc2UoYSk7aWYoYy5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhY1sieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX07QmEucHJvdG90eXBlLkVhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfTtCYS5wcm90b3R5cGUuSGE9ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9O0JhLnByb3RvdHlwZS5pc1BsYXlpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH07CkJhLnByb3RvdHlwZS5leGl0RnVsbHNjcmVlbj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYz1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYyl0cnl7Yz1jKCl9Y2F0Y2goZCl7Yz0hMX1jJiZhLmV4aXRGdWxsc2NyZWVuKCl9O0JhLnByb3RvdHlwZS5jdXJyZW50VGltZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfTt5KGZhLEUpO2ZhLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5YPXRoaXMuWHx8ITE7dGhpcy5zYSh0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLmVhKCksdGhpcy5sYSgpLHRoaXMuQSgpKX07ZmEucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEpe3JldHVybiBsLmIoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX07ZmEucHJvdG90eXBlLnM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTsKYS5pbWEzJiYodGhpcy5pbWE9YS5pbWEzKTtpZihhLmltYSl7dGhpcy5pbWE9YS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChjKXt9fXJldHVybiB0aGlzLmltYX07ZmEucHJvdG90eXBlLk89ZnVuY3Rpb24oKXtpZighdGhpcy5JYSl7dmFyIGE9dGhpcy5zKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5JYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5JYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5JYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYKKHRoaXMuSWE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMuSWF9O2ZhLnByb3RvdHlwZS5aPWZ1bmN0aW9uKCl7aWYoIXRoaXMudSl7dmFyIGE9dGhpcy5zKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMudT1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMudT1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLnV9O2ZhLnByb3RvdHlwZS5xYT1mdW5jdGlvbigpe2lmKCF0aGlzLlApe3ZhciBhPXRoaXMucygpLGM9dGhpcy5vYSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxjKSYmKHRoaXMuUD0hMCl9cmV0dXJuIHRoaXMuUH07ZmEucHJvdG90eXBlLm9hPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTSYmYS5hZHMmJihhLmFkcy5zdGF0ZXx8YS5hZHMuX3N0YXRlKSYmKHRoaXMuTT0hMCk7cmV0dXJuIHRoaXMuTX07ZmEucHJvdG90eXBlLkE9ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5PKCk7aWYoYSl7dmFyIGM9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGQ9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkEoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGYpe3RoaXMuZihmKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oKXt0aGlzLnRhKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGYpe3RoaXMuZihmKTt0aGlzLkkoImFkZXJyb3IiLHRoaXMuWCk7dGhpcy5jKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5pKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BKCl9LmJpbmQodGhpcyksMjApfTtmYS5wcm90b3R5cGUudGE9ZnVuY3Rpb24oKXt0aGlzLkc9ITA7dmFyIGE9dGhpcy5aKCk7aWYoYXx8dGhpcy5pKCkpe3ZhciBjPQoiYWRFcnJvciIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGYpe3RoaXMuZihmKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oZil7dGhpcy5mKGYpO3RoaXMuSSgiYWRlcnJvciIsdGhpcy5YKTt0aGlzLmMoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtsLnJhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLApmdW5jdGlvbigpe2wuYigiY2hpcC5kZSIpJiZsLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubz0hMDtsLmIoImNoaXAuZGUiKSYmbC50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubz0hMDtpZihsLmIoImNoaXAuZGUiKSl7dmFyIGY9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7bC50cmFjaygic3RhdHNfY3VzdF8iK2UrIm1pZHBvaW50IiwiIiwhMCk7bC50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwoIWYucGF1c2VkKCkpLnRvU3RyaW5nKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubz0hMDtsLmIoImNoaXAuZGUiKSYmCmwudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5vPSEwO2wuYigiY2hpcC5kZSIpJiZsLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMubz0hMDtsLmIoImNoaXAuZGUiKSYmbC50cmFjaygic3RhdHNfY3VzdF8iK2UrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5vfHwodGhpcy5JKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5jKCksdGhpcy5OKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BKCl9LmJpbmQodGhpcyksMjApfTtmYS5wcm90b3R5cGUubGE9CmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGMpe3RoaXMuZihjKTt0aGlzLmMoKTt0aGlzLkkoImFkZXJyb3IiLHRoaXMuWCl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmcoKTt0aGlzLmMoITApO3RoaXMuSSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYyl7dGhpcy5mKGMpO3RoaXMuYygpO3RoaXMuSSgiYWRlcnJvciIsdGhpcy5YKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGMpe3RoaXMuZihjKTt0aGlzLmMoKTt0aGlzLkkoImFkZXJyb3IiLHRoaXMuWCl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGMpe3RoaXMuZihjKTt0aGlzLmMoKTt0aGlzLkkoImFkZXJyb3IiLHRoaXMuWCl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsCmZ1bmN0aW9uKCl7dGhpcy5MKCl9LmJpbmQodGhpcykpfTtmYS5wcm90b3R5cGUuRD1mdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihnLkgmJmcuSC5iKWcuSC5KYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChjKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YSYmKChhPXRoaXMuWigpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcyksNTApKX07ZmEucHJvdG90eXBlLmVhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoYS5pc1BsYXlpbmcoKSYmMDxhLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5xYSgpKXt2YXIgYz10aGlzLnMoKSxkPXRoaXMuTygpO2MmJmQmJih0aGlzLkd8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HPwp0aGlzLkwoKToodGhpcy5jKCEwKSx0aGlzLkkoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLmRhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zKCksZj10aGlzLk8oKTtlJiYhZj8odGhpcy5JKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmMoKSk6KHRoaXMuYyghMCksdGhpcy5JKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZGE9ITA7YS5pc1BsYXlpbmcoKSYmMTA8YS5jdXJyZW50VGltZSgpfHx0aGlzLmkoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNTApfTtmYS5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtmdW5jdGlvbiBjKGYsaCl7dmFyIG09ITE7aWYoZil7aWYoMTAwOT09Znx8MzAzPT1mfHw0MDM9PWYpbT0hMDttfHwhZi5pbmRleE9mfHwtMT09PWYuaW5kZXhPZigiMTAwOSIpJiYtMT09PQpmLmluZGV4T2YoIjMwMyIpJiYtMT09PWYuaW5kZXhPZigiNDAzIil8fChtPSEwKTsibnVtYmVyIj09dHlwZW9mIGYmJihoLlg9ZixoLkkoImFkZXJyb3IiLGYpKX1yZXR1cm4gbX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZjKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuY2EoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmMoYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLmNhKCk7YnJlYWt9fTtmYS5wcm90b3R5cGUuY2E9CmZ1bmN0aW9uKCl7dGhpcy5tYSgpPyh0aGlzLks9ITAsbC51PWwuUygpLHRoaXMuUz0hbC51LHRoaXMuTighMCkpOih0aGlzLks9ITAsdGhpcy5MKCJlbXB0eSB2YXN0IikpfTtmYS5wcm90b3R5cGUubWE9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9bC5HKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlg/ITA6bC5TKCl9O2ZhLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09YT8hMTphO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LPyhsLnV8fHRoaXMuTCgpLHRoaXMuYigpKTp0aGlzLk4oYSl9LmJpbmQodGhpcyksMTAwKX07ZmEucHJvdG90eXBlLk49ZnVuY3Rpb24oYSl7dGhpcy5pKCl8fCh2b2lkIDAhPT1hJiZhfHwodGhpcy5TPSExKSx0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmEodGhpcy5TLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9Owp5KEJiLEYpO0JiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIik7dmFyIGM9dGhpcy5jKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2M9Y3x8dGhpcy5jKGFbZF0pfWNhdGNoKGUpe310aGlzLmcoKX19O0JiLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yz1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihjPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1jLmxlbmd0aCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZGVvanMtcGxheWVyIikpJiZhLnBsYXllciYmYS5wbGF5ZXIucGxheWVyJiYoYT1hLnBsYXllci5wbGF5ZXIoKSxjLnB1c2goYSkpO2lmKDA8bC56YShjKSl7Zm9yKHZhciBkIGluIGMpYy5oYXNPd25Qcm9wZXJ0eShkKSYmCihhPW5ldyBCYShjW2RdKSxhLml8fHRoaXMuYihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5pKGEpLChuZXcgZmEoYSx0aGlzLmEpKS53KCkpKTtyZXR1cm4hMH1yZXR1cm4hMX07QmIucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXt0aGlzLmxjPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDEwMCl9O3ZhciBOYz1uZXcgQmIoWCk7VC5hKE5jKTt5KEFhLEEpO0FhLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnVpJiZhLnVpLnRhZ0F0dHJpYnV0ZXM/YS51aS50YWdBdHRyaWJ1dGVzLmlkPyhhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEudWkudGFnQXR0cmlidXRlcy5pZCkpPyh0aGlzLmIoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5nKGEpOnRoaXMuYSgpKTp0aGlzLmEoKTp0aGlzLmEoKTp0aGlzLmEoKX07QWEucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSl7dGhpcy5mPQphfTtBYS5wcm90b3R5cGUuRWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZD8hMDohMX07QWEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfTtBYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfTtBYS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWR9O0FhLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZD8hMToodGhpcy5wYXVzZSgpLCEwKX07QWEucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9O0FhLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufTtBYS5wcm90b3R5cGUuYWE9CmZ1bmN0aW9uKCl7cmV0dXJuIlRIRU9wbGF5ZXIifTt5KEFiLEUpO0FiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7YS5hZHMmJmEuYWRzLmFkZEV2ZW50TGlzdGVuZXImJmEuYWRzLmFkZEV2ZW50TGlzdGVuZXIoImFkZXJyb3IiLGZ1bmN0aW9uKGMpe2M9Yy5lcnJvckNvZGU7MTAwOT09Y3x8MzAzPT1jfHw0MDM9PWM/dGhpcy5iKCk6KHRoaXMuSSgiYWRlcnJvciIsYyksdGhpcy5jKCkpfS5iaW5kKHRoaXMpKTt0aGlzLmYoKX07QWIucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTthLmFkcyYmYS5hZHMuY3VycmVudEFkcyYmMDxhLmFkcy5jdXJyZW50QWRzLmxlbmd0aCYmYS5hZHMucGxheWluZz90aGlzLkwoKTohdGhpcy5wbGF5ZXIuaXNQYXVzZWQoKSYmLjI8dGhpcy5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLmMoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfTtBYi5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTt0aGlzLnBsYXllci5pc1BhdXNlZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKGEpfS5iaW5kKHRoaXMpLDUwKTp0aGlzLmEoYSl9O3koaGMsRik7aGMucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXtpZih3aW5kb3cuVEhFT3BsYXllciYmd2luZG93LlRIRU9wbGF5ZXIucGxheWVycylmb3IodmFyIGEgaW4gd2luZG93LlRIRU9wbGF5ZXIucGxheWVycyl7dmFyIGM9d2luZG93LlRIRU9wbGF5ZXIucGxheWVyc1thXTtjLnBsYXkmJihjPW5ldyBBYShjKSxjLml8fHRoaXMuYihjKXx8KHRoaXMuaShjKSxjLmwodGhpcy5hKSwobmV3IEFiKGMsdGhpcy5hKSkudygpKSl9dGhpcy51KCk7dGhpcy5nKCl9O3ZhciBPYz1uZXcgaGMoWCk7VC5hKE9jKTt5KGFiLEEpO2FiLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7Zy5UYz8odGhpcy5mPWcuVGMsdGhpcy5iKHRoaXMuZi54YSgpKSx0aGlzLmcodGhpcy5mLlIoKSkpOgp0aGlzLmEoKX07YWIucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCl9O2FiLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5mLnBsYXkoKX07YWIucHJvdG90eXBlLndkPWZ1bmN0aW9uKGEsYyl7aWYoInRpbWV1cGRhdGUiPT1hKXthPWMudGFyZ2V0LmhlaWdodDt2YXIgZD1jLnRhcmdldC5jdXJyZW50VGltZSxlPWMudGFyZ2V0LmR1cmF0aW9uLGY9TWF0aC5mbG9vcihkKSxoPXt9O2gud2lkdGg9Yy50YXJnZXQud2lkdGg7aC5oZWlnaHQ9YTtoLmN1cnJlbnRUaW1lPWQ7aC5kdXJhdGlvbj1lO2gucmVtYWluaW5nVGltZT1lLWQ7aC5ldmVudD0iQWRSZW1haW5pbmdUaW1lQ2hhbmdlIjtmIT10aGlzLmwmJigwPT1mJiYoaC5ldmVudD0iaW1wcmVzc2lvbiIpLGY9PU1hdGguZmxvb3IoZS80KSYmKGguZXZlbnQ9ImZpcnN0cXVhcnRpbGUiKSxmPT1NYXRoLmZsb29yKGUvMikmJihoLmV2ZW50PSJtaWRwb2ludCIpLGY9PU1hdGguZmxvb3IoMyplLzQpJiYKKGguZXZlbnQ9InRoaXJkcXVhcnRpbGUiKSx0aGlzLm0oaCksdGhpcy5sPWYpfWVsc2UiZW5kZWQiPT1hJiZ0aGlzLm0oe2V2ZW50OiJlbmRlZCJ9KX07YWIucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7YS52ZXJ0aWNhbGl6ZXI9ITA7dGhpcy5hYiYmdGhpcy5hYi5wb3N0TWVzc2FnZShhLCIqIil9O2FiLnByb3RvdHlwZS5hYT1mdW5jdGlvbigpe3JldHVybiJWZXJ0aWNhbGl6clBsYXllciJ9O3koZ2MsRSk7Z2MucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudmVydGljYWxpemVyJiYodGhpcy5hYj1hLnNvdXJjZSx0aGlzLnBsYXllci5hYj1hLnNvdXJjZSx0aGlzLmEoKSl9LmJpbmQodGhpcykpfTt5KGZjLEYpO2ZjLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGFiKHt9KTt0aGlzLmIoYSl8fGEuaXx8KHRoaXMuaShhKSwobmV3IGdjKGEsdGhpcy5hKSkudygpKTsKdGhpcy5nKCl9O3ZhciBQYz1uZXcgZmMoZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIucGF1c2UoKTtsLmEodi5iLHRoaXMucGxheWVyLkNhKCkpO3ZhciBjPWcudi5hO2E9bmV3IGlhKGEsYyk7YS5leGl0RnVsbHNjcmVlbigpO2cuSC5KYT0hMDthPW5ldyB1KGEsZy5ILGMpO2EuTmIoYyk7YS5lYSgidmVydGljYWxpenIiKTt0aGlzLnBsYXllci5rZChhKX0pO1QuYShQYywhMCk7eSh1YSxBKTt1YS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYz1hLnBsYXllckNvbnRhaW5lcjtpZighYyYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmKGM9YS5wYXJlbnROb2RlKSwhYykpe3RoaXMuYSgpO3JldHVybn10aGlzLmIoYyk7YT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLAp0aGlzLmw9ITApO2E/dGhpcy5nKGEpOnRoaXMuYSgpfTt1YS5wcm90b3R5cGUueWU9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5oYyxkPXRoaXMueWEoKSxlPSIiO2EubWVtbyYmKGU9YS5tZW1vLnZpZGVvaWQpO2UmJmMmJmMuVmImJigwPD1kLmluZGV4T2YoZSl8fGMua2MoKSl9O3VhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbihhKXthfHwodGhpcy5mPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX07dWEucHJvdG90eXBlLkhhPWZ1bmN0aW9uKCl7dGhpcy5mKys7aWYoMTA8dGhpcy5mKXJldHVybiExOwp0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfTt1YS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9O3VhLnByb3RvdHlwZS5pc1BsYXlpbmc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTphLmlzUGxheWluZ307dWEucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU/YS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWU/d2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKTowfTt1YS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uP2EucGxheWVySW5zdGFuY2UuZHVyYXRpb246d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uP3dpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCk6MH07dWEucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifTt1YS5wcm90b3R5cGUuTmE9ZnVuY3Rpb24oKXt9O3koZWIsRSk7ZWIucHJvdG90eXBlLm89ZnVuY3Rpb24oKXtpZighdGhpcy51KWlmKHRoaXMuY3x8Cih0aGlzLmM9MCksdGhpcy5wbGF5ZXIuaXNQbGF5aW5nKCkmJnRoaXMuYysrLDE1PHRoaXMuYyl0aGlzLkkoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5mKCEwKTtlbHNle3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy51PSEwO3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oZCl7dGhpcy5HKGQpO3RoaXMuc3x8KHRoaXMuSSgiYWRlcnJvciIsdGhpcy5YKSx0aGlzLmYoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fTtlYi5wcm90b3R5cGUuQT1mdW5jdGlvbigpe3RoaXMucz0hMDt0aGlzLkwoImVtcHR5IHZhc3QiKX07ZWIucHJvdG90eXBlLkc9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhmLGgpe3ZhciBtPSExO2lmKGYpe2lmKDEwMDk9PWZ8fDMwMz09Znx8NDAzPT1mKW09ITA7bXx8IWYuaW5kZXhPZnx8LTE9PT1mLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1mLmluZGV4T2YoIjMwMyIpJiYtMT09PWYuaW5kZXhPZigiNDAzIil8fChtPSEwKTsibnVtYmVyIj09dHlwZW9mIGYmJihoLlg9ZixoLkkoImFkZXJyb3IiLGYpKX1yZXR1cm4gbX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiYKYyhkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmMoYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkEoKTticmVha319O2ViLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7dGhpcy5YPXRoaXMuWHx8ITE7dGhpcy5vKCk7dmFyIGM9d2luZG93Lm92VmlkZW87Y3x8KGM9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YyYmYy5yZWdpc3RlckV2ZW50JiYhdGhpcy5EPyhjLnJlZ2lzdGVyRXZlbnQoYy5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpLGMucmVnaXN0ZXJFdmVudChjLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSksCmMucmVnaXN0ZXJFdmVudChjLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSksYy5yZWdpc3RlckV2ZW50KGMuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLkkoImFkZXJyb3IiLHRoaXMuWCk7dGhpcy5mKCl9LmJpbmQodGhpcykpLHRoaXMuRD0hMCxjLnJlZ2lzdGVyRXZlbnQoYy5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihkKXthLnllKGQpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSwxMDApfTtlYi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYKKHRoaXMucGxheWVyPW5ldyB1YSh3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLmEoYSl9O3koZWMsRik7ZWMucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1uZXcgdWEoYVtjXSk7ZC5pfHx0aGlzLmIoZCl8fCh0aGlzLmkoZCksKG5ldyBlYihkLHRoaXMuYSkpLncoKSl9dGhpcy5nKCl9O3ZhciBRYz1uZXcgZWMoWCk7VC5hKFFjKTt5KHphLEEpO3phLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtjfHwoYT10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3RoaXMuYihjKTt0aGlzLm8oYSk7dGhpcy5mKCl9O3phLnByb3RvdHlwZS5vPWZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfTt6YS5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3ZhciBhPXRoaXMueGEoKSxjPXRoaXMuUigpOwpjfHwoKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxjP3RoaXMuZyhjKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCkpfTt6YS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9O3phLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9O3phLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfTt6YS5wcm90b3R5cGUuYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfTsKemEucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9O3phLnByb3RvdHlwZS5FYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO3JldHVybiBhP2EubXV0ZWQ6ITB9O3phLnByb3RvdHlwZS5DYT1mdW5jdGlvbigpe3ZhciBhPXt9LGM9dGhpcy5SKCksZD10aGlzLnhhKCk7aWYoYS52aWRlb1RhZz1jKWEudmlkZW9UYWdJZD1jLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9O3koTWEsRSk7TWEucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10YygpO3RoaXMuYz10aGlzLmN8fCExO3ZhciBjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO2MubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oZCxlKXt0aGlzLk8oZSl9LmJpbmQodGhpcykpO2MubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5zPQohMDt0aGlzLk4mJnRoaXMuTSgpfS5iaW5kKHRoaXMpKTtjLm1iLnN1YnNjcmliZShhLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZD10aGlzLnBsYXllci5oYztkJiZkLlZiJiZ0aGlzLnBsYXllci5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2MubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmYoKTt0aGlzLk49ITA7dGhpcy5NKCl9LmJpbmQodGhpcykpO3RoaXMuRygpfTtNYS5wcm90b3R5cGUuTT1mdW5jdGlvbigpe3RoaXMuY3x8KGhiKCJpbWE6ICIrdGhpcy5mKCksIk9veWFsYSIpLHRoaXMuc3x8dGhpcy5mKCk/dGhpcy5zJiZ0aGlzLkQmJiF0aGlzLnUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMDApKX07TWEucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLksoKTtyZXR1cm4gYSYmYS5hZE1hbmFnZXJzJiZhLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX07TWEucHJvdG90eXBlLks9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZigiYWRNYW5hZ2VyQ29udHJvbGxlciI9PT1kLm5hbWUpcmV0dXJuIGQuaW5zdGFuY2V9fTtNYS5wcm90b3R5cGUuRz1mdW5jdGlvbigpe2lmKHRoaXMuZigpKXt2YXIgYT10aGlzLksoKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy51PTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuRD1hLnBmfXRoaXMuaSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpLDEwMCl9O01hLnByb3RvdHlwZS5QPWZ1bmN0aW9uKGEpe3JldHVybiBhLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfTtNYS5wcm90b3R5cGUuTz1mdW5jdGlvbihhKXt0aGlzLmM9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0sMTApOjA7MTAwOT09dGhpcy5jfHwzMDI9PXRoaXMuYz90aGlzLkE9ITA6dGhpcy5JKCJhZGVycm9yIix0aGlzLmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX07TWEucHJvdG90eXBlLm89ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjt0aGlzLkE/KHRoaXMuTCgpLHRoaXMuYigpKTphLmFkKCk/KHRoaXMuYSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5QKGEpPyh0aGlzLmEoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwMCl9O3koZGMsRik7ZGMucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLmw9MTUwMDt2YXIgYT10YygpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8bC56YShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBjIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGMpKXt2YXIgZD1uZXcgemEoYS5fX2ludGVybmFsLnBsYXllcnNbY10pO3RoaXMuYihkKXx8KHRoaXMuaShkKSwobmV3IE1hKGQsdGhpcy5hKSkudygpKX10aGlzLmcoKX07dmFyIFJjPW5ldyBkYyhYKTtULmEoUmMpO3koSGEsQSk7SGEucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt0aGlzLmk9ITE7dGhpcy5mKCl9O0hhLnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7dmFyIGE9ITEsYz0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTsKYXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudHx8dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnRFbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihjPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYyYmKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYz8odGhpcy5iKGEpLHRoaXMuZyhjKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfTtIYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfTtIYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX07SGEucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9OwpIYS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX07SGEucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7dGhpcy5sKCl9O0hhLnByb3RvdHlwZS5sPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5jJiYoMCx0aGlzLmMpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoKX0uYmluZCh0aGlzKSwxMDApfTtIYS5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifTt5KHpiLEUpO3piLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBjPWEuY29kZSxkPWEubWVzc2FnZTthLmRhdGEmJihjPWEuZGF0YS5jb2RlLGQ9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWMmJig5MDA9PWMmJjA8ZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMuTCgiZW1wdHkiKSx0aGlzLmIoKSk6CjEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jP3RoaXMuYigpOnRoaXMuZigpKX07emIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBjPTA7YzxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2MrKyl0aGlzLmMoYS5hZEVycm9yRXZlbnRzW2NdKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oZCl7dGhpcy5jKGQpfS5iaW5kKHRoaXMpKTthLnBsYXllci5vbigicGxheWluZyIsZnVuY3Rpb24oKXt2YXIgZD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTtpZihkLmFkRXJyb3JFdmVudHMpZm9yKHZhciBlPTA7ZTxkLmFkRXJyb3JFdmVudHMubGVuZ3RoO2UrKyl0aGlzLmMoZC5hZEVycm9yRXZlbnRzW2VdKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5MKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfTt6Yi5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3RoaXMucGxheWVyLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5hKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMCl9O3koS2IsRik7S2IucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7YT1uZXcgSGEoYSk7YS5pP3RoaXMuZygpOnRoaXMuYihhKXx8KGEubyhNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5pKGEpLChuZXcgemIoYSx0aGlzLmEpKS53KCkpfTtLYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMubXx8KHRoaXMubT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGMpe3RoaXMuYyhjLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4pe2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuYyh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pfWVsc2UgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYml0bW92aW5wbGF5ZXItY29udGFpbmVyIikpZm9yKGE9CjA7YTxkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJiaXRtb3ZpbnBsYXllci1jb250YWluZXIiKS5sZW5ndGg7YSsrKXRoaXMuYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJiaXRtb3ZpbnBsYXllci1jb250YWluZXIiKVthXSk7dGhpcy5nKCl9O3ZhciBTYz1uZXcgS2IoWCk7VC5hKFNjKTt5KGRiLEEpO2RiLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxjPWEuY29udGFpbmVyO2EuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJue2FkdmVydGlzaW5nOntwcmVyb2xsQWRUYWc6InZlcnRpY2FsaXpyIn19fTtpZihjKXt0cnl7Yy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChkKXt9dGhpcy5iKGMpO3RoaXMuZyhjKX1lbHNlIHRoaXMuYSgpfTtkYi5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt3aW5kb3cuYj1nO2lmKCF0aGlzLmlzUGF1c2VkKXt0aGlzLmlzUGF1c2VkPSEwO2Zvcih2YXIgYT10aGlzLnBsYXllci5jb250YWluZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpLApjPTA7YzxhLmxlbmd0aDtjKyspYVtjXS5zdHlsZS5maWx0ZXI9ImJsdXIoOHB4KSI7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7YS5zdHlsZS53aWR0aD0iMTAwJSI7YS5zdHlsZS5oZWlnaHQ9IjEwMCUiO2Euc3R5bGUudG9wPSIwIjthLnN0eWxlLmxlZnQ9IjAiO2Euc3R5bGUuZm9udEZhbWlseT0iU3BpZWdlbFNlcmlmVUksQXJpYWwsc2Fucy1zZXJpZiI7YS5zdHlsZS5mb250U2l6ZT0iMjBweCI7YS5pbm5lckhUTUw9IjxiPkxpdmVUaWNrZXI8L2I+Ijt0aGlzLmw9YTt0aGlzLnBsYXllci5jb250YWluZXIuYXBwZW5kQ2hpbGQoYSk7dGhpcy5wbGF5ZXIuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSI7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLnN0eWxlLmJhY2tncm91bmRDb2xvcj0icmVkIjtjLnN0eWxlLmZvbnRGYW1pbHk9IlNwaWVnZWxTZXJpZlVJLEFyaWFsLHNhbnMtc2VyaWYiOwpjLnN0eWxlLmNvbG9yPSJ3aGl0ZSI7Yy5zdHlsZS5mb250U2l6ZT0iMTVweCI7Yy5zdHlsZS5wYWRkaW5nTGVmdD0iMTVweCI7Yy5zdHlsZS5tYXJnaW5Ub3A9IjIwcHgiO2MuaW5uZXJIVE1MPSJOdXIgZWluIFZpZGVvIHp1bSBMYWRlbiBkZXMgVGlja2VycyA+IjtjLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yy5vbmNsaWNrPWZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKTtjPS41NjI1KnRoaXMucGxheWVyLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZC5zdHlsZS53aWR0aD0iMTAwJSI7ZC5zdHlsZS5oZWlnaHQ9IiIrYysicHgiO2Quc3R5bGUubWF4SGVpZ2h0PSI1MDBweCI7ZC5zdHlsZS50b3A9IjAiO2Quc3R5bGUubGVmdD0iMCI7ZC5vbmNsaWNrPWZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyk7CmEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5iKGQpfX07ZGIucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXtpZih0aGlzLmlzUGF1c2VkKXt0aGlzLmlzUGF1c2VkPSExO3RoaXMubC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubCk7Zm9yKHZhciBhPXRoaXMucGxheWVyLmNvbnRhaW5lci5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2IiksYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uc3R5bGUuZmlsdGVyPSIifX07ZGIucHJvdG90eXBlLkRlPWZ1bmN0aW9uKGEpe3RoaXMuZj1hfTtkYi5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oKXtyZXR1cm4iY2xvYWtlciJ9O3koY2MsRSk7Y2MucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcixjPWEuZ2V0UmF3UGxheWVyKCkuY29uZi5hZEJyZWFrVGltZTthLkRlKGZ1bmN0aW9uKCl7Zy52LmkudmVydGljYWxpenI9ITE7dGhpcy5hKCl9LmJpbmQodGhpcykpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5wYXVzZSgpfSwKYyl9O3koYmMsRik7YmMucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT1nLmouYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZihhJiZhLnF1ZXJ5S2V5JiZhLnF1ZXJ5S2V5LmFkYnJlYWtlcil7Zy5WZD0hMDt2YXIgYz1nLnYuYigiY2xvYWtlciIpfHxUYzthLnF1ZXJ5S2V5LmFkQnJlYWtUaW1lJiYoYy5hZEJyZWFrVGltZT1hLnF1ZXJ5S2V5LmFkQnJlYWtUaW1lKTthLnF1ZXJ5S2V5Lm1pbkhlaWdodCYmKGMubWluSGVpZ2h0PWEucXVlcnlLZXkubWluSGVpZ2h0KTthLnF1ZXJ5S2V5LnF1ZXJ5U2VsZWN0b3JBbGwmJihjLnF1ZXJ5U2VsZWN0b3JBbGw9YS5xdWVyeUtleS5xdWVyeVNlbGVjdG9yQWxsKTtpZihjKXthPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYy5xdWVyeVNlbGVjdG9yQWxsKTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTsiRElWIj09ZS5ub2RlTmFtZSYmKGU9bmV3IGRiKHtjb250YWluZXI6ZSxjb25mOmN9KSxlLml8fHRoaXMuYihlKXx8Cih0aGlzLmkoZSksKG5ldyBjYyhlLHRoaXMuYSkpLncoKSkpfXRoaXMuZygpfX19O3ZhciBUYz17cXVlcnlTZWxlY3RvckFsbDoiLm91dGJyYWluLWNvbnRhaW5lciIsYWRCcmVha1RpbWU6IjUwMCJ9LFVjPW5ldyBiYyhYKTtULmEoVWMpO3koJGEsQSk7JGEucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXtpZih0aGlzLmdldFJhd1BsYXllcigpLnRvU3RyaW5nKCkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudG9TdHJpbmcoKSk7dGhpcy5iKGEpO2lmKGEpe3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuZyhjKX1lbHNlIHRoaXMuYSgpfWVsc2UgdGhpcy5hKCl9OyRhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYSl7fX07CiRhLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fTskYS5wcm90b3R5cGUuV2I9ZnVuY3Rpb24oKXt2YXIgYT1nLnYuYTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9OyRhLnByb3RvdHlwZS5hYT1mdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9O3koeWIsRSk7eWIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTt0YS5CKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5MLmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7dGEuQigiIyIrYSwib2JqZWN0IixmdW5jdGlvbihjKXt0aGlzLmMoYyl9LmJpbmQodGhpcykpO3RhLkIoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsCmZ1bmN0aW9uKCl7dGhpcy5JKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5hKCl9LmJpbmQodGhpcykpO3RhLkIoIiMiK2EsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5JKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuYSgpfS5iaW5kKHRoaXMpKTt0YS5EKCl9O3liLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBjPSIiLGQ7Zm9yKGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpKXtjPWlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMuTCgpO3RoaXMuYigpO3JldHVybn1mb3IodmFyIGUgaW4gYVtkXSlpZihhW2RdLmhhc093blByb3BlcnR5KGUpJiYoYz1pc05hTihhW2RdW2VdKT8hMTphW2RdW2VdLDEwMDk9PWFbZF1bZV18fDEwMDE9PWFbZF1bZV18fDMwMz09YVtkXVtlXXx8NDAzPT1hW2RdW2VdKSl7dGhpcy5MKCk7dGhpcy5iKCk7cmV0dXJufX10aGlzLkkoImFkZXJyb3IiLApjKTt0aGlzLmEoKX07eShjYixGKTtjYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yy5sZW5ndGg7ZCsrKWEucHVzaChjW2RdKTtjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKWEucHVzaChjW2RdKTt0aGlzLm8mJihhPWwuRGIoYSx0aGlzLm8pKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZT1hW2NdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIik7ZT1uZXcgJGEoZSk7aWYoIXRoaXMuYihlKSYmIWUuaSl7dGhpcy5pKGUpO3ZhciBmPW5ldyB5YihlLHRoaXMuYSk7Zi53KCl9fWZvcihjPTA7YzxhLmxlbmd0aDtjKyspZm9yKGQ9YVtjXTtkLnBhcmVudEVsZW1lbnQ7KXtkPWQucGFyZW50RWxlbWVudDt2YXIgaD1kLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIrCmgpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLm98fCh0aGlzLm89W10pLHRoaXMuby5wdXNoKGFbY10pLGU9bmV3ICRhKGgpLHRoaXMuYihlKXx8ZS5pfHwodGhpcy5pKGUpLGY9bmV3IHliKGUsdGhpcy5hKSxmLncoKSl9Y2F0Y2gobSl7fX19dGhpcy5nKCl9O2NiLnByb3RvdHlwZS5CPWZ1bmN0aW9uKGEsYyxkKXt0aGlzLmN8fCh0aGlzLmM9e30pO3RoaXMuY1thXXx8KHRoaXMuY1thXT17fSk7dGhpcy5jW2FdW2NdfHwodGhpcy5jW2FdW2NdPVtdKTt0aGlzLmNbYV1bY10ucHVzaChkKX07Y2IucHJvdG90eXBlLk49ZnVuY3Rpb24oYSl7dmFyIGM9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5jfHx0aGlzLmMmJiF0aGlzLmNbY10pdGhpcy5tfHwodGhpcy5tPVtdKSx0aGlzLm0ucHVzaChhKSx0aGlzLk0oKSYmKHRoaXMudSgpLHRoaXMudygpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNbY11bZF0mJgowPHRoaXMuY1tjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmNbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmNbY11bZF1bZV0oYSl9fTtjYi5wcm90b3R5cGUuRD1mdW5jdGlvbigpe2lmKHRoaXMubSlmb3IodmFyIGE9MDthPHRoaXMubS5sZW5ndGg7YSsrKXt2YXIgYz10aGlzLm1bYV0sZD1jLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGMub0V2ZW50VHlwZSYmKGU9Yy5vRXZlbnRUeXBlKTtpZih0aGlzLmNbZF1bZV0mJjA8dGhpcy5jW2RdW2VdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuY1tkXVtlXS5sZW5ndGg7ZisrKXRoaXMuY1tkXVtlXVtmXShjKX19O2NiLnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBkPTE7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCk7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdGEuTihhKX07CnZhciB0YT1uZXcgY2IoWCk7VC5hKHRhKTtyYygpO3koWmEsQSk7WmEucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnRvU3RyaW5nKCkpO3RoaXMuYihhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLmcoYyl9O1phLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBhdXNlKCl9KX07WmEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX07WmEucHJvdG90eXBlLkhhPWZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJgphLnBhdXNlKCl9KX07WmEucHJvdG90eXBlLkVhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9O1phLnByb3RvdHlwZS5hYT1mdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifTt5KGFjLEUpO2FjLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7bC5nKDMpO3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihjKXtsLk8ucHVzaCh7Ilt3aWR0aF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRXaWR0aH0pO2wuTy5wdXNoKHsiW2hlaWdodF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRIZWlnaHR9KTt0aGlzLnBsYXllci5tdXRlZD1jLmRhdGEubXV0ZWQ7Yy5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Mub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWMuaXNQbGF5aW5nfHxjLmlzUGxheWluZygpKWMuaXNBZCYmCmMuaXNBZCgpP3RoaXMuTCgpOmMuZGF0YSYmYy5kYXRhLmFkcyYmYy5kYXRhLmFkcy52YXN0JiZjLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMuSSgibm9BZCIsInBsYXllZCIpLHRoaXMuYSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSSgibm9BZCIsInBsYXllZCIpO3RoaXMuYSghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7Yy5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yy5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmEoKX0uYmluZCh0aGlzKSk7Yy5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmEoKX0uYmluZCh0aGlzKSk7Yy5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5MKCl9LmJpbmQodGhpcykpO2Mub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLkwoKX0uYmluZCh0aGlzKSk7CmMub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLkwoKX0uYmluZCh0aGlzKSk7Yy5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5MKCl9LmJpbmQodGhpcykpO2Mub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkwoKX0uYmluZCh0aGlzKSk7Yy5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5MKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX07eShKYixGKTtKYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9YVtjXSxlPSIiO3RyeXtlPWQuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGgpe2U9ZC5pZH1pZihlJiYKJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IFphKGUpO3RoaXMuYihmKXx8KHRoaXMuaShmKSwobmV3IGFjKGYsdGhpcy5hKSkudygpKX1jYXRjaChoKXt9fXRoaXMuZygpfTtKYi5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXt2YXIgYz1hLmdldFJhd1BsYXllcigpOyQoIiMiK2MpO2Zvcih2YXIgZCBpbiB0aGlzLmYpaWYoYz09dGhpcy5mW2RdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLmZbYS55YSgpXT8hMDohMX07dmFyIFZjPW5ldyBKYihYKTtULmEoVmMpO3kocWEsQSk7cWEucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPSExO3RoaXMuYWI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGQpe3RyeXtpZihkJiZkLnNvdXJjZSYmZC5zb3VyY2UuX2VudnZhcnMpe3RoaXMuc3x8KGQudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMuU2MoKX0uYmluZCh0aGlzKSksCnRoaXMucz0hMCk7dmFyIGU9dGhpcy51KGQuc291cmNlLl9lbnZ2YXJzKTtlJiYodGhpcy5tPWUpO2lmKCF0aGlzLkImJihkLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGQuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgZj1kLnNvdXJjZS5DSE9PU0VSX0FCfHwiIixoPWQuc291cmNlLkNIT09TRVJfVElNRXx8IiI7bC50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsZiwhMCk7bC50cmFjaygic3RhdHNfY2hvb3Nlcl9pbnRlcmFjdGlvbiIsZisocGFyc2VJbnQoaCwxMCk9PWg/IiI6Il9hdXRvcGxheSIpLCEwKTtsLnRyYWNrKCJzdGF0c19jaG9vc2VyX3RpbWUiLGgsITApO3RoaXMuQj0hMDt0aGlzLmFiPWQuc291cmNlfX19Y2F0Y2gobSl7fX0uYmluZCh0aGlzKSk7dGhpcy53YygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYz1hKTt0aGlzLmIoYSk7dGhpcy5nKGMpOwp0aGlzLkcodGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTtoYigic2V0IHVwIHBsYXllciBET05FIix0aGlzLmdldFJhd1BsYXllcigpLGEsIk9ubHlIT01BRCIpfTtxYS5wcm90b3R5cGUudWQ9ZnVuY3Rpb24oYSl7dGhpcy5sfHwodGhpcy5sPVtdKTt0aGlzLmwucHVzaChhKX07cWEucHJvdG90eXBlLnpkPWZ1bmN0aW9uKCl7dGhpcy5hYiYmdGhpcy5hYi5wb3N0TWVzc2FnZSgiY2xpY2t0aHJvdWdoX2V2ZW50Iil9O3FhLnByb3RvdHlwZS5TYz1mdW5jdGlvbigpe2lmKHRoaXMubCYmdGhpcy5sLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubC5sZW5ndGg7YSsrKXRyeXt0aGlzLmxbYV0oKX1jYXRjaChjKXt9fTtxYS5wcm90b3R5cGUuZXhpdEZ1bGxzY3JlZW49ZnVuY3Rpb24oKXtyZXR1cm4hMH07cWEucHJvdG90eXBlLndjPWZ1bmN0aW9uKCl7aWYodGhpcy5tKXJldHVybiB0aGlzLm07aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTsKaWYoYT10aGlzLnUoYSkpcmV0dXJuIHRoaXMubT1hfX07cWEucHJvdG90eXBlLnU9ZnVuY3Rpb24oYSl7dmFyIGM9ITE7YSYmYS52aWRlb1Nsb3QmJihjPWEpO2EmJmEuaGR2cGFpZCYmKGM9YS5oZHZwYWlkKTtyZXR1cm4gY307cWEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7fTtxYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe307cWEucHJvdG90eXBlLkc9ZnVuY3Rpb24oYSxjKXthJiZhLnBhdXNlRXZlbnQmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmYmJnRoaXMuZi5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZi5wYXVzZSYmdGhpcy5mLnBhdXNlKCl9LmJpbmQodGhpcykpO2EmJmEucmVzdW1lRXZlbnQmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mJiZ0aGlzLmYucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mLnJlc3VtZSYmdGhpcy5mLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZiYmdGhpcy5mLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmYubXV0ZSYmdGhpcy5mLm11dGUoKX0uYmluZCh0aGlzKSk7YSYmYS51bm11dGVFdmVudCYmYy5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmYmJnRoaXMuZi51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmYudW5tdXRlJiZ0aGlzLmYudW5tdXRlKCl9LmJpbmQodGhpcykpfTtxYS5wcm90b3R5cGUuQ2Q9ZnVuY3Rpb24oYSl7dGhpcy5mPWF9O3FhLnByb3RvdHlwZS5hYT1mdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifTt5KEliLEUpO0liLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCksYz10aGlzLnBsYXllcjthLmF1dG9zdGFydCYmIXRoaXMubyYmKHRoaXMuZigpLHRoaXMubz0hMCx0aGlzLmcoKSk7CmMueGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcykpfTtJYi5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3RoaXMucGxheWVyLndjKCk/dGhpcy5hKCk6KHRoaXMuY3x8KHRoaXMuYz0xKSx0aGlzLmMrKywxMDx0aGlzLmM/dGhpcy5hKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTApKX07eSgkYixGKTskYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKGcudi5nKXtpZihnLnYuYS5wbGF5ZXIpe3ZhciBhPWcudi5hLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goZSl7bC50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYyxkPTA7ZDxhLmxlbmd0aDtkKyspYz1uZXcgcWEoYVtkXSksdGhpcy5iKGMpfHwodGhpcy5pKGMpLChuZXcgSWIoYyx0aGlzLmEpKS53KCkpfX1lbHNlIHRoaXMuZygpfTt2YXIgV2M9bmV3ICRiKFgpO1QuYShXYyk7CnkoTGEsQSk7TGEucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5iKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmcoYSk7dGhpcy5MYT0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5MYT0hMH0uYmluZCh0aGlzKSl9O0xhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX07TGEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX07TGEucHJvdG90eXBlLkVhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5SKCk7cmV0dXJuIGE/YS5tdXRlZDohMH07TGEucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9O0xhLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufTsKTGEucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5jPygwLHRoaXMuYykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfTtMYS5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9O3koa2IsRSk7a2IucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfTtrYi5wcm90b3R5cGUuQT1mdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihjKXtjPWMuZ2V0RXJyb3IoKTtjLmdldEVycm9yQ29kZSgpO3RoaXMuY3x8KHRoaXMuYz1bXSk7dGhpcy5jLnB1c2goYy5nZXRFcnJvckNvZGUoKSk7CjEwMDk9PWMuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yy5nZXRFcnJvckNvZGUoKXx8NDAzPT1jLmdldEVycm9yQ29kZSgpP3RoaXMuYigpOnRoaXMuSSgiYWRlcnJvciIsYy5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm89ITA7dGhpcy5MKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9O2tiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5mP3RoaXMuQSh0aGlzLmYpOih0aGlzLmY9dGhpcy51KCksd2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMTAwKSl9O2tiLnByb3RvdHlwZS5zPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoYS5MYSYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLmYpe3RoaXMuYSgpO3JldHVybn1pZighdGhpcy5vKXt0aGlzLmEoKTtyZXR1cm59YT0KITA7aWYodGhpcy5jJiZ0aGlzLmMubGVuZ3RoJiYxPHRoaXMuYy5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmMubGVuZ3RoLTE7YysrKTEwMDkhPXRoaXMuY1tjXSYmMzAzIT10aGlzLmNbY10mJjQwMyE9dGhpcy5jW2NdJiYoYT0hMSk7aWYoYSl0aGlzLkwoImVtcHR5IiksdGhpcy5iKCk7ZWxzZXt0aGlzLmEoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksNTAwKX07eShaYixGKTtaYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMubD0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBjIGluIGEpe3ZhciBkPW5ldyBMYShhLml0ZW0oK2MpKTt0aGlzLmIoZCl8fC0xPT1kLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLmkoZCksKG5ldyBrYihkLHRoaXMuYSkpLncoKSl9dGhpcy5nKCl9O3ZhciBYYz0KbmV3IFpiKFgpO1QuYShYYyk7eSh5YSxBKTt5YS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5iKGEpO3RoaXMuZyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKX07eWEucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmwoKX0uYmluZCh0aGlzKSw1MDApfTt5YS5wcm90b3R5cGUubD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSxjPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmMmJjA8YyYmYT49Yy0xJiZ0aGlzLmMmJnRoaXMuYygpfTt5YS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGM9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYz1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpOwpyZXR1cm4gY307eWEucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxjPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGM9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gY307eWEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfTt5YS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5mKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX07eWEucHJvdG90eXBlLmlzUGxheWluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9O3lhLnByb3RvdHlwZS5KZT1mdW5jdGlvbigpe3RoaXMuZj0Kd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX07eWEucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifTt5KEhiLEUpO0hiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5vPTEwO3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO3RoaXMuZnx8KHRoaXMuZj0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkkoImFkZXJyb3IiKTt0aGlzLmMoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMuSSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5jKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5JKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSwKdGhpcy5jKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMuSSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5jKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLkkoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuYygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5JKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5JKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmMoKSkpOih0aGlzLkkoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuYygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5JKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmMoKSkpOih0aGlzLmZ8fHRoaXMuZisrLHRoaXMuZjw9dGhpcy5vPyh0aGlzLmYrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5JKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmMoKSkpfTtIYi5wcm90b3R5cGUuYz1mdW5jdGlvbigpe3RoaXMucGxheWVyLmlzUGxheWluZygpPyh0aGlzLnBsYXllci5KZSgpLHRoaXMuYSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9O3koWWIsRik7WWIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGM7YSYmYVswXSYmKGM9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmNbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB5YSh3aW5kb3cucGxheWVyQXBpKSx0aGlzLmIoYSl8fCh0aGlzLmkoYSksKG5ldyBIYihhLHRoaXMuYSkpLncoKSkpO3RoaXMuZygpfTt2YXIgWWM9bmV3IFliKFgpO1QuYShZYyk7eShTYSwKQSk7U2EucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2E/YS5wYXJlbnROb2RlPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlKT8odGhpcy5iKGEpLChhPXRoaXMuZ2V0UmF3UGxheWVyKCkpPyh0aGlzLmcoYSksdGhpcy5MYT0hMSxhLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5MYT0hMH0uYmluZCh0aGlzKSkpOnRoaXMuZj0hMCk6dGhpcy5mPSEwOnRoaXMuZj0hMDp0aGlzLmY9ITB9O1NhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX07U2EucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX07U2EucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxjPSIiO2EuY3VycmVudFRpbWUmJihjPWEuY3VycmVudFRpbWUpOwpyZXR1cm4gY307U2EucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxjPTA7YS5kdXJhdGlvbiYmKGM9YS5kdXJhdGlvbik7cmV0dXJuIGN9O1NhLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxjPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZjJiYxPmMtYT90aGlzLmMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfTtTYS5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn07eShZYSxFKTtZYS5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLnhhKCksYz10aGlzLnBsYXllci5SKCk7YyYmYy5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5wbGF5ZXIuTGE9ITF9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5MKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMuTCgpfS5iaW5kKHRoaXMpKTthPXRoaXMuZigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuQSgpOnRoaXMucygpO2EuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYSgpfHwodGhpcy5JKCJjb250ZW50cGxheSIpLHRoaXMuYyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9O1lhLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dGhpcy5iYSgpfHx0aGlzLmMoITApfTtZYS5wcm90b3R5cGUuQT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZigpOyFhLklhJiZhLk1hJiZhLm1mJiZhLm5mJiYodGhpcy5JKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuYygpKX07WWEucHJvdG90eXBlLnM9ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5mKCk7YS5hZHNMb2FkZXI/YS5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGMpe2E6e2M9Yy5nZXRFcnJvcigpO2ZvcihkIGluIGMpaWYoIm51bWJlciI9PXR5cGVvZiBjW2RdKXt2YXIgZD1jW2RdO2JyZWFrIGF9ZD12b2lkIDB9MTAwOT09ZHx8MzAzPT1kfHw0MDM9PWQ/KHRoaXMuTCgpLHRoaXMuYigpKToodGhpcy5JKCJhZGVycm9yIixkKSx0aGlzLmMoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTAwKX07WWEucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtpZighdGhpcy5vKWZvcih2YXIgYT1rYy5jKCksYz10aGlzLnBsYXllci54YSgpLmlkLGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmlkPT1jJiYodGhpcy5vPWFbZF0pO3JldHVybiB0aGlzLm99O1lhLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09CmE/ITE6YTt0aGlzLnBsYXllci5MYT9hP3RoaXMuZigpLmFkc0xvYWRlcj90aGlzLmEoITApOnRoaXMuYSgpOnRoaXMuYSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKGEpfS5iaW5kKHRoaXMpLDEwKX07eSh4YixGKTt4Yi5wcm90b3R5cGUubT1mdW5jdGlvbihhKXthPW5ldyBTYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5iKGEpfHxhLmZ8fCh0aGlzLmkoYSksKG5ldyBZYShhLHRoaXMuYSkpLncoKSl9O3hiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9a2MuYygpO2lmKGEmJmEubGVuZ3RoKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMubShhW2NdKTt0aGlzLmcoKX07eGIucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXt2YXIgYTtpZihnLnYuZyYmZy52LmEucGxheWVyYXBpJiYoYT1nLnYuYS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO2E9W107dmFyIGM9CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYyYmYy5sZW5ndGgpe2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZT1jW2RdLmZlcm1vZDtlJiZhLnB1c2goZSl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYz1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmMubGVuZ3RoKXtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKWNbZF0mJmNbZF0uZmVybW9kJiZhLnB1c2goY1tkXS5mZXJtb2QpLGNbZF0mJmNbZF0ucGFyZW50RWxlbWVudCYmY1tkXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGNbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QpLGNbZF0mJmNbZF0ucGFyZW50RWxlbWVudCYmY1tkXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmNbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGNbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7CmlmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfTt2YXIga2M9bmV3IHhiKFgpO1QuYShrYyk7eShLYSxBKTtLYS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTt0Yi5jJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuYihhKTtpZihhLnRhZ05hbWUpe3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWM/dGhpcy5nKGMpOnRoaXMuYSgpfWVsc2UgdGhpcy5hKCl9O0thLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe2lmKHRiLmMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX07CkthLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7aWYodGIuYyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX07S2EucHJvdG90eXBlLkhhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5SKCk7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX07S2EucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifTtLYS5wcm90b3R5cGUuV2I9ZnVuY3Rpb24oKXtyZXR1cm4hMH07S2EucHJvdG90eXBlLnhhPWZ1bmN0aW9uKCl7aWYodGIuYyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGR9ZWxzZSBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTthIT0KdGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9O3koR2IsRSk7R2IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5jPWEuaWQpO3RiLmM/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGMpe3ZhciBkPWMucGxheWVyQ29udGFpbmVyO2QmJnRoaXMuYyYmZCE9dGhpcy5jfHwiYWRlcnJvciIhPWMuZXZlbnR8fGwuYigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09Yy5hZFR5cGV8fChjLmFkVVJMJiYoY29uZi5hZFRhZz1jLmFkVVJMKSx0aGlzLkkoImFkZXJyb3IiLGMudWYpLHRoaXMuYSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGMpeyJhZGVycm9yIj09YyYmCih0aGlzLkkoImFkZXJyb3IiKSx0aGlzLmEoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX07eShYYixGKTtYYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe3RoaXMuYz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKHRoaXMuYylmb3IodmFyIGM9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1jLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChjW2VdKSlhPW5ldyBLYShhKSxhLml8fHRoaXMuYihhKXx8KHRoaXMuaShhKSxhPW5ldyBHYihhLHRoaXMuYSksYS53KCkpfWVsc2UgaWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT0KbmV3IEthKGEpLGEuaT90aGlzLnUoKTp0aGlzLmIoYSl8fCh0aGlzLmkoYSksYT1uZXcgR2IoYSx0aGlzLmEpLGEudygpKX10aGlzLmcoKX07dmFyIHRiPW5ldyBYYihYKTtULmEodGIpO3koUmEsQSk7UmEucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEpaWYoYS5HZXRWaWRlb0VsKWlmKGEuR2V0RWwpe3ZhciBjPWEuR2V0VmlkZW9FbCgpO2E9YS5HZXRFbCgpO2MmJmE/KHRoaXMuYihhKSx0aGlzLmcoYykpOnRoaXMuYSgpfWVsc2UgdGhpcy5hKCk7ZWxzZSB0aGlzLmEoKTtlbHNlIHRoaXMuYSgpfTtSYS5wcm90b3R5cGUuRWE9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfTtSYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9O1JhLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09YT8hMTphOwp2YXIgYz10aGlzLmdldFJhd1BsYXllcigpO2E/Yy5Jc1BhdXNlZCgpJiZjLlBsYXkoKTooYy5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9O1JhLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9O1JhLnByb3RvdHlwZS5XYj1mdW5jdGlvbigpe2lmKGcuai5NKCkmJmcuai5iKCJ0LW9ubGluZS5kZSIpKXJldHVybiExO3ZhciBhPWcudi5hO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX07UmEucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9O3koWGEsRSk7WGEucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLlg9dGhpcy5YfHwhMTt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTtnLmouYigidC1vbmxpbmUuZGUiKSYmZy5qLk0oKSYmIWcuai5LYSgpJiYKKGEuU2V0VkFTVFByZXJvbGxUYWcoImh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3ZlcnRpY2FsaXpyL3Zhc3Q0LWVtcHR5LnhtbCIpLGcudi5hLnJ1bkluc2lkZUNvbnRhaW5lcj0hMSk7dGhpcy5vKCk7Zy5qLmIoInQtb25saW5lLmRlIikmJmcuai5NKCkmJmcuai5LYSgpJiYobmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oYyl7Yy5mb3JFYWNoKGZ1bmN0aW9uKGQpeyJhdHRyaWJ1dGVzIj09PWQudHlwZSYmInNyYyI9PT1kLmF0dHJpYnV0ZU5hbWUmJihkPW5ldyBkYSh0aGlzLnBsYXllci52aWRlb1RhZy5zcmMpLGQuaG9zdC5pbmNsdWRlcygidmVydGljYWxpenIuY29tIil8fChkLmhvc3QuaW5jbHVkZXMoImRsYzIudC1vbmxpbmUuZGUiKT9udWxsIT10aGlzLnBhcmVudCYmdGhpcy51KCk6KHRoaXMucGxheWVyLnZpZGVvVGFnLnNyYz0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iK2cuai5BKHRoaXMucGxheWVyLnZpZGVvVGFnLnNyYykrCiImYz0iK2cuai5zKDEwKSx0aGlzLnBsYXllci52aWRlb1RhZy5sb2FkKCksdGhpcy5wbGF5ZXIudmlkZW9UYWcucGxheSgpLHRoaXMuQSgpKSkpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpLm9ic2VydmUodGhpcy5wbGF5ZXIudmlkZW9UYWcse2F0dHJpYnV0ZXM6ITAsY2hpbGRMaXN0OiEwLGNoYXJhY3RlckRhdGE6ITB9KTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihjKXt0aGlzLmYoYyl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLkwoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkwoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuTCgpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYyl7Yy5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWMuZGV0YWlsLm5hbWUmJnRoaXMuZygpfS5iaW5kKHRoaXMpKX07ClhhLnByb3RvdHlwZS5BPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIueGEoKTt0aGlzLnBhcmVudD1hLnBhcmVudEVsZW1lbnQ7dGhpcy5jPWEuc3R5bGU7YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Euc3R5bGUudG9wPSIwcHgiO2Euc3R5bGUubGVmdD0iMHB4IjthLnN0eWxlLndpZHRoPSIxMDAlIjthLnN0eWxlLmhlaWdodD0iMTAwJSI7YS5zdHlsZS56SW5kZXg9IjIwMDAwIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfTtYYS5wcm90b3R5cGUudT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLnhhKCk7YS5zdHlsZT10aGlzLmM7dGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQoYSk7dGhpcy5wYXJlbnQ9bnVsbDt0aGlzLmM9e319O1hhLnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLGM9YS5HZXRBZEVycm9yc0NhY2hlKCksZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZihjW2RdKTthLkNsZWFyQWRFcnJvcnNDYWNoZSgpfTsKWGEucHJvdG90eXBlLmY9ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLm8oKTtlbHNle2lmKCJvYmplY3QiPT10eXBlb2YgYSlpZihhJiZhLmxlbmd0aClmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdJiZhW2NdLnZhc3RFcnJvckNvZGUmJihhPWFbY10udmFzdEVycm9yQ29kZSk7ZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7YSYmYS5pbmRleE9mJiYwPD1hLmluZGV4T2YoIkFkRXJyb3IgMTAwOSAoVGhlIFZBU1QgcmVzcG9uc2UgZG9jdW1lbnQgaXMgZW1wdHkiKSYmKGE9MTAwOSk7bC51PWwuUygpJiYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpO2wudXx8MTAwOSE9YSYmMzAzIT1hJiY0MDMhPWE/KHRoaXMuSSgiYWRlcnJvciIsYSksdGhpcy5zKCkpOih0aGlzLkwoKSx0aGlzLmIoKSl9fTtYYS5wcm90b3R5cGUucz1mdW5jdGlvbigpe3RoaXMuYSghMSl9O3koV2IsRik7V2IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrOwphfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9bmV3IFJhKGFbY10pO2QuaXx8dGhpcy5iKGQpfHwodGhpcy5pKGQpLChuZXcgWGEoZCx0aGlzLmEpKS53KCkpfXRoaXMuZygpfTt2YXIgWmM9bmV3IFdiKFgpO1QuYShaYyk7eShXYSxBKTtXYS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGM9YS5lbDsoYT1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5iKGMpLHRoaXMuZyhhKSk6dGhpcy5hKCl9ZWxzZSB0aGlzLmEoKX07V2EucHJvdG90eXBlLkVhPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5wbGF5ZXIubXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfTtXYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfTsKV2EucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9O1dhLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX07V2EucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifTt5KHdiLEUpO3diLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5YPXRoaXMuWHx8ITE7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7YS5hZGQoImFkRXJyb3IiLHRoaXMuZi5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLkwuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMuTC5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLkwuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy5MLmJpbmQodGhpcykpfTt3Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtpZihudWxsIT1hKXtpZigib2JqZWN0Ij09CnR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10mJmFbY10udmFzdEVycm9yQ29kZSYmKGE9YVtjXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5MKCksdGhpcy5iKCkpOih0aGlzLkkoImFkZXJyb3IiLGEpLHRoaXMuYygpKX19O3diLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7dGhpcy5hKCExKX07eShWYixGKTtWYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycyxjO2ZvcihjIGluIGEpe3ZhciBkPW5ldyBXYShhW2NdKTtkLml8fHRoaXMuYihkKXx8KHRoaXMuaShkKSx3aW5kb3cuYnJpZHBsYXllcj1kLChuZXcgd2IoZCx0aGlzLmEpKS53KCkpfX10aGlzLmcoKX07CnZhciAkYz1uZXcgVmIoWCk7VC5hKCRjKTt5KHNhLEEpO3NhLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYSYmYVswXSlpZigoYT1hWzBdKSYmIkFkdmVydGlzZW1lbnQiPT1hLmdldEF0dHJpYnV0ZSgidGl0bGUiKSl0aGlzLmEoKTtlbHNle2Zvcih2YXIgYz1hO2MmJmMucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yy5wYXJlbnROb2RlLm5vZGVOYW1lKXtjPWMucGFyZW50Tm9kZTticmVha31jPWMucGFyZW50Tm9kZX10aGlzLmcoYSk7dGhpcy5iKGMpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihkKXtpZihkJiZkLmRhdGEmJiJ3ZWxlY3RyZWFkeSI9PWQuZGF0YSl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFkTG9hZGluZ1NjcmVlbiIpO2UmJihlLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX1kJiZkLmRhdGEmJiJ3ZWxlY3Rkb25lIj09ZC5kYXRhJiYoZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibGFzdEZyYW1lRmFkZXJDYW52YXMiKSkmJgooZC5wYXJlbnROb2RlLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0pfWVsc2UgdGhpcy5hKCl9O3NhLnByb3RvdHlwZS5sPWZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50KXZhciBjPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTtlbHNlIGM9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYy5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSx7fSk7YyYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYyl9O3NhLnByb3RvdHlwZS5tPWZ1bmN0aW9uKCl7dGhpcy5mPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkU3RhcnQiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmZ8fCh0aGlzLmY9ITAsdGhpcy5sKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSl9O3NhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RyeXt0aGlzLmwoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy5SKCkucGF1c2UoKX19OwpzYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RyeXt0aGlzLmYmJih0aGlzLmwoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5mPSExKSx0aGlzLmwoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMuUigpLnBsYXkoKX19O3NhLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe2lmKCF0aGlzLlIoKS5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH07c2EucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifTt5KHJhLEUpO3JhLnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5MKCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5MKCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLkwoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLkwoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGMpe3RoaXMuYyhjKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihjKXt0aGlzLmMoYyl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYyl7dGhpcy5jKGMpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5ELmJpbmQodGhpcyksMTApfTtyYS5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYz17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGM9YS5nZXRFcnJvcigpKTtjLmdldEVycm9yQ29kZT8oYy5nZXRFcnJvckNvZGUoKSx0aGlzLkkoImFkZXJyb3IiLGMuZ2V0RXJyb3JDb2RlKCkpLHRoaXMucz0hMCwxMDA5PT1jLmdldEVycm9yQ29kZSgpfHwKMzAzPT1jLmdldEVycm9yQ29kZSgpfHw0MDM9PWMuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuTT0hMCx0aGlzLkwoKSk6dGhpcy5mKCkpOih0aGlzLnN8fHRoaXMuSSgibm9mcmFtZXdvcmsiKSx0aGlzLmYoKSl9O3JhLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy5pKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudS5iaW5kKHRoaXMpLDEwMCl9O3JhLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5EKCk7dGhpcy51KCk7dGhpcy5HKCl9O3JhLnByb3RvdHlwZS5HPWZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLm8uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5jKGEpfS5iaW5kKHRoaXMpKX07cmEucHJvdG90eXBlLmY9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7dGhpcy5BP3RoaXMuYShhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZihhKX0uYmluZCh0aGlzKSwxMDApfTtyYS5wcm90b3R5cGUubz1mdW5jdGlvbihhKXt0aGlzLkE9ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBjIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWMmJihhLmRldGFpbFtjXXx8dGhpcy5jKGEpKX07eShHYSxGKTtHYS5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IHNhKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5pfHx0aGlzLmIoYSl8fCh0aGlzLmkoYSksYS5tKCksYT1uZXcgcmEoYSx0aGlzLmEpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5vLmJpbmQoYSkpLGEudygpKX10aGlzLmcoKX07CnZhciBhZD1uZXcgR2EoWCk7VC5hKGFkKTt5KFUsQSk7VS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYz1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYyl7dGhpcy5iKGMpO3ZhciBkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuZyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGUsZil7dGhpcy5sPWU7dGhpcy51PWZ9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oZSl7dGhpcy5kdXJhdGlvbj1lfS5iaW5kKHRoaXMpKSk6dGhpcy5hKCl9ZWxzZSB0aGlzLmEoKX1lbHNlIHRoaXMuYSgpfTtVLnByb3RvdHlwZS5CPWZ1bmN0aW9uKGEpe3RoaXMubT1hfTtVLnByb3RvdHlwZS5FYT1mdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihhPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9O1UucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9O1UucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfTtVLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfTtVLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmx9O1UucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259O1UucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9O1UucHJvdG90eXBlLk5hPQpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5zKGEpfS5iaW5kKHRoaXMpKX07VS5wcm90b3R5cGUucz1mdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBjPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmMmJjA8YyYmYT49Yy0xJiYhdGhpcy5mJiYodGhpcy5mPSEwLHRoaXMuYyYmdGhpcy5jKCkpfTt5KGJhLEUpO2JhLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMucylpZih0aGlzLmZ8fCh0aGlzLmY9MCksdGhpcy5mKyssMTU8dGhpcy5mKXdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhP3dpbmRvdy5jYW5SdW5BZHM/CnRoaXMuemEoKTp0aGlzLmMoITApOih0aGlzLkkoIm5vZnJhbWV3b3JrIiwiSU1BIiksYS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmMoKTp0aGlzLmMoITApKTtlbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMucz0hMDt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGQpe3RoaXMuRChkKTt0aGlzLm98fCh0aGlzLkkoImFkZXJyb3IiLHRoaXMuWCksdGhpcy5jKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfTtiYS5wcm90b3R5cGUuQT0KZnVuY3Rpb24oKXt0aGlzLm89ITA7dGhpcy5MKCJlbXB0eSB2YXN0Iil9O2JhLnByb3RvdHlwZS5EPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoZixoKXt2YXIgbT0hMTtpZihmKXtpZigxMDA5PT1mfHwzMDM9PWZ8fDQwMz09ZiltPSEwO218fCFmLmluZGV4T2Z8fC0xPT09Zi5pbmRleE9mKCIxMDA5IikmJi0xPT09Zi5pbmRleE9mKCIzMDMiKSYmLTE9PT1mLmluZGV4T2YoIjQwMyIpfHwobT0hMCk7Im51bWJlciI9PXR5cGVvZiBmPyhoLlg9ZixoLkkoImFkZXJyb3IiLGYpKTpoLkkoImFkZXJyb3IiKX1yZXR1cm4gbX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZjKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmCmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmMoYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkEoKTticmVha319O2JhLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5YPXRoaXMuWHx8ITE7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7dGhpcy51KCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYyl7InBsYXlpbmciPT1jJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfTtiYS5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTt0aGlzLmlzUGxheWluZz90aGlzLmEoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoYSl9LmJpbmQodGhpcyksMTApfTt5KEksRik7SS5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IFUod2luZG93Lmluc2VydGVkUGxheWVyKTthLml8fHRoaXMuYihhKXx8KHRoaXMuaShhKSxhPW5ldyBiYShhLHRoaXMuYSksYS53KCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiYKd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYz0wO2M8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2MrKylhPW5ldyBVKHdpbmRvdy5UVjJQbGF5ZXJzW2NdKSxhLml8fHRoaXMuYihhKXx8KHRoaXMuaShhKSxhPW5ldyBiYShhLHRoaXMuYSksYS53KCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGMgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYykmJndpbmRvdy5UVjJQbGF5ZXJzW2NdLnZpZGVvTW9kZWwmJihhPW5ldyBVKHdpbmRvdy5UVjJQbGF5ZXJzW2NdKSxhLml8fHRoaXMuYihhKXx8KHRoaXMuaShhKSxhLkIodGhpcy5hKSxhPW5ldyBiYShhLHRoaXMuYSksYS53KCkpKTt0aGlzLnUoKTt0aGlzLmcoKX07dmFyIGJkPW5ldyBJKFgpO1QuYShiZCk7eSh3LEEpO3cucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTt0aGlzLmIoYSk7dmFyIGM9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuZyhjKTt0aGlzLmYoKX07dy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheVN0YXRlKCk7YSE9dGhpcy5sJiYodGhpcy5sPWEpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDIpfTt3LnByb3RvdHlwZS5hYT1mdW5jdGlvbigpe3JldHVybiJsYW9sYTEifTt3LnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX07dy5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX07eShyLEUpO3IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLnM9MDt0aGlzLlg9dGhpcy5YfHwhMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTt0aGlzLkcoKX07ci5wcm90b3R5cGUuRz0KZnVuY3Rpb24oKXtpZigodGhpcy5jPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZ0aGlzLmMuYWRzTG9hZGVyKXJldHVybiB0aGlzLklhPXRoaXMuYy5hZHNMb2FkZXIsdGhpcy5vKCksITA7dGhpcy5zKys7aWYodGhpcy5zPnRoaXMuSyl0aGlzLkkoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5mKCEwKTp0aGlzLmYoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkcuYmluZCh0aGlzKSwxMDApLCExfTtyLnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYTtpZihhKXt2YXIgYz0iYWRFcnJvciIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmCihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oZSl7dGhpcy5BKGUpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihlKXt0aGlzLkEoZSk7dGhpcy5JKCJhZGVycm9yIix0aGlzLlgpO3RoaXMuTSgpfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmkoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwyMCl9O3IucHJvdG90eXBlLkE9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhmLApoKXt2YXIgbT0hMTtpZihmKXtpZigxMDA5PT1mfHwzMDM9PWZ8fDQwMz09ZiltPSEwO218fCFmLmluZGV4T2Z8fC0xPT09Zi5pbmRleE9mKCIxMDA5IikmJi0xPT09Zi5pbmRleE9mKCIzMDMiKSYmLTE9PT1mLmluZGV4T2YoIjQwMyIpfHwobT0hMCk7Im51bWJlciI9PXR5cGVvZiBmJiYoaC5YPWYsaC5JKCJhZGVycm9yIixmKSl9cmV0dXJuIG19YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYyhkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkQoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgpjKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EKCk7YnJlYWt9fTtyLnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dGhpcy51PSEwfTtyLnByb3RvdHlwZS5NPWZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnU/KHRoaXMuTCgpLHRoaXMuYigpKTp0aGlzLmYoITApfS5iaW5kKHRoaXMpLDEwMCl9O3IucHJvdG90eXBlLmY9ZnVuY3Rpb24oYSl7dGhpcy5hKHZvaWQgMD09PWE/ITE6YSl9O3kocSxGKTtxLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE7aWYoKGE9ZXZhbCgidHJ5IHtzcmF2dnBsUGxheWVySW5zdGFuY2VzfWNhdGNoKGUpe2ZhbHNlfSIpKXx8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMmJndpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aCYmMDx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGgpZm9yKHZhciBjPWF8fHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLGQ9CjA7ZDxjLmxlbmd0aDtkKyspYT1uZXcgdyhjW2RdKSx0aGlzLmIoYSl8fCh0aGlzLmkoYSksKG5ldyByKGEsdGhpcy5hKSkudygpKTt0aGlzLmcoKX07dmFyIGNkPW5ldyBxKFgpO1QuYShjZCk7eSh0LEEpO3QucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxjPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goZCl7fWEmJmM/KHRoaXMuYihhKSx0aGlzLmcoYyksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5hKCl9O3QucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9O3QucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9O3QucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn07eShRLEUpO1EucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLmMoKX07ClEucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KCh2b2lkIDA9PT1hPzA6YSk/KHRoaXMuSSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmEoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoITApfS5iaW5kKHRoaXMpLDEwMCkpfTt5KEssRik7Sy5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyB0KHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmkpe3RoaXMuZygpO3JldHVybn1pZighdGhpcy5iKGEpKXt0aGlzLmkoYSk7KG5ldyBRKGEsdGhpcy5hKSkudygpO3RoaXMuZygpO3JldHVybn19dGhpcy5nKCl9O3ZhciBkZD1uZXcgSyhYKTtULmEoZGQpO3koRyxBKTtHLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuYihhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLmcoYSk6dGhpcy5hKCkpOnRoaXMuYSgpfTtHLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfTtHLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX07Ry5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oKXtyZXR1cm4iQVYifTt5KHgsRSk7eC5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcykpO3RoaXMuZigpO3RoaXMubygpfTsKeC5wcm90b3R5cGUubz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBjPTA7YzxhLmFkc0xvYWRlci5sZW5ndGg7YysrKXt2YXIgZD0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihkPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2NdLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihlKXtlLmdldEVycm9yJiYoZT1lLmdldEVycm9yKCkpO3ZhciBmPSExO2lmKDEwMDk9PWV8fDMwMz09ZXx8NDAzPT1lKWY9ITA7aWYoIWYpZm9yKHZhciBoIGluIGUpe2lmKGVbaF0mJmVbaF0uaW5kZXhPZiYmCigtMSE9ZVtoXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1lW2hdLmluZGV4T2YoIjMwMyIpfHwtMSE9ZVtoXS5pbmRleE9mKCI0MDMiKSkpe2Y9ITA7YnJlYWt9aWYoZVtoXSYmKDEwMDk9PWVbaF18fDMwMz09ZVtoXXx8NDAzPT1lW2hdKSl7Zj0hMDticmVha319Zj8odGhpcy5MKCksdGhpcy5iKCkpOnRoaXMuYygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9O3gucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtpZighdGhpcy5pKCkpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCksdGhpcy5MKCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHwKYS5fYWRSZWdpc3RlcmVkP3RoaXMuYygpOnRoaXMuYyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX19O3gucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMUU0KTt0aGlzLmEoYSl9O3kobixGKTtuLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2E9bmV3IEcoYSk7YS5pP3RoaXMuZygpOnRoaXMuYihhKXx8KHRoaXMuaShhKSwobmV3IHgoYSx0aGlzLmEpKS53KCkpfTtuLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuYyh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuYyh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLmcoKX07CnZhciBlZD1uZXcgbihYKTtULmEoZWQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYSl7aWYoYS5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYz1hLmZpbGVuYW1lP2EuZmlsZW5hbWU6IiI7aWYoLTEhPWMuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWMuaW5kZXhPZigiaGQtbWFpbiIpKWM9YS5tZXNzYWdlP2EubWVzc2FnZToiIixhPWEuZXJyb3Iuc3RhY2s/YS5lcnJvci5zdGFjazoiIiwtMSE9Yy5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhhPWMuc3Vic3RyaW5nKGMuaW5kZXhPZigiOiIpKzEsYy5pbmRleE9mKCJpcyBub3QiKS0xKSxsLlAodi5ZKSxsLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixhLCEwKSk6LTEhPWEuaW5kZXhPZigic2V0QCIpJiYobC5QKHYuUyksbC50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBJYz1nLmoubC5nZXQoInNldEludGVydmFsIiksSmM9Zy5qLmwuZ2V0KCJzZXRUaW1lb3V0Iik7Cmcudj1uZXcgcWI7dHJ5e3ZhciBsYz1kb2N1bWVudC5jdXJyZW50U2NyaXB0fHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj0iaGQtbWFpbi5qcyJdJyk7bGMmJmxjLnNldEF0dHJpYnV0ZSgiaWQiLGcuai5sYigpKTt2YXIgeWM9bGMuZ2V0QXR0cmlidXRlKCJkYXRhLWluZm8iKTt5YyYmKGcudi5hPXdpbmRvd1t5Y10pfWNhdGNoKGEpe312YXIgTmI9bmV3IENhO2hiKCJjaGFubmVsTmFtZTogIitOYi5hKCksIkhvbWFkSW5pdCIpO2hiKCJjaGFubmVsTmFtZURlcHJlY2F0ZWQ6ICIrTmIuZigpLCJIb21hZEluaXQiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihOYi5hKCksZnVuY3Rpb24oYSl7Zy52Lmd8fChnLnYuYT1hLmRldGFpbCl9LCExKTtsLmhhKHdpbmRvdyxsLmcoMTApLHt9KTt2YXIgdmM9bC5nKDEwKTt1YygpO2sucHJvdG90eXBlLk09ZnVuY3Rpb24oKXt0aGlzLm89ITB9O2sucHJvdG90eXBlLkI9ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmM9CnRoaXMucGxheWVyLmFhKCk7Zy5wbGF5ZXI9YX07ay5wcm90b3R5cGUuRz1mdW5jdGlvbihhKXt0aGlzLmI9YX07ay5wcm90b3R5cGUuRj1mdW5jdGlvbihhKXt0aGlzLmc9YX07ay5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmdbYV07dGhpcy5nW3RoaXMuY10mJnRoaXMuZ1t0aGlzLmNdW2FdJiYoYz10aGlzLmdbdGhpcy5jXVthXSk7cmV0dXJuIGN9O2sucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSxjKXtjPXZvaWQgMD09PWM/ITE6YztnLlVhLmcoKTt2YXIgZD0hMTtpZih0aGlzLnUoKSl0aGlzLmIuU2EodGhpcy5iLmZjLHRoaXMuYi5CYSx0aGlzLmIuZWQsZnVuY3Rpb24oKXt0aGlzLmkoYSxjKX0uYmluZCh0aGlzKSx0aGlzLmIudGIpO2Vsc2UgaWYobC51JiYtMT09PXdhLlFhLmluZGV4T2YoInN2bV9kcm9wIikmJih3YS5RYSs9IiZzdm1fZHJvcD0xIiksd2Eua2ImJiF3YS5IZCl3YS51ZShmdW5jdGlvbigpe3RoaXMuaShhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7CmwuYSh2LmIsdGhpcy5wbGF5ZXIuQ2EoKSk7dmFyIGU9dGhpcy5nLGY9bmV3IGlhKHRoaXMucGxheWVyLGUpO2MmJmYuSygpO2YuZXhpdEZ1bGxzY3JlZW4oKTt2YXIgaD1uZXcgdShmLHRoaXMuYixlKTtoLk5iKHRoaXMuZyk7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoZT0hMSx0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihlPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKSxhPWEoZSkpO2F8fGwudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLnNlJiYoZD0hMSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmVhKGEsZCk7dGhpcy5wbGF5ZXIua2QoaCl9LmJpbmQodGhpcyksMCl9fTtrLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGU7aWYodGhpcy5mKXt2YXIgYz1hLmdldFRpbWUoKS10aGlzLmYuZ2V0VGltZSgpO3RoaXMuZj1hO3JldHVybiAzRTU8Yz8hMDohMX10aGlzLmY9YTsKcmV0dXJuITF9O2sucHJvdG90eXBlLk49ZnVuY3Rpb24oKXtsLnBhKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5hKCJhZFRhZyIpO3RoaXMuYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubShhKSk/dGhpcy5pKGEpOihsLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksbC5hKHYuZyx0aGlzLnBsYXllci5DYSgpKSl9O2sucHJvdG90eXBlLks9ZnVuY3Rpb24oYSl7aWYoIXRoaXMubyl7bC5wYSgicG9zdHJvbGwiKTt0aGlzLk0oKTt2YXIgYz10aGlzLmEoImFkVGFnIik7dGhpcy5hKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLm0oYykpP3RoaXMuaShjLGcudi5iKCJwb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQiKT8hMDphKToobC50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGwuYSh2LmcsdGhpcy5wbGF5ZXIuQ2EoKSkpfX07ay5wcm90b3R5cGUubT1mdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX07ay5wcm90b3R5cGUuRD1mdW5jdGlvbigpe3RoaXMucGxheWVyLkllKHRoaXMuSy5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfTtrLnByb3RvdHlwZS5zPWZ1bmN0aW9uKGEpe2wucGEoIm1pZHJvbGwiKTtpZighdGhpcy5sKXt0aGlzLmw9ITA7dmFyIGM9dGhpcy5hKCJhZFRhZyIpO3RoaXMuYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuaShjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sPSExfS5iaW5kKHRoaXMpLDFFMykpOihsLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxsLmEodi5nLHRoaXMucGxheWVyLkNhKCkpKX19O2sucHJvdG90eXBlLkE9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5IZSh0aGlzLnMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuY2QoKX07ay5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMuTigpO3RoaXMucGxheWVyLmNkJiZ0aGlzLkEoKTt0aGlzLkQoKX19KSgpO30pKCk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
78.46.33.212 Nuremberg, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.212.33.46.78.clients.your-server.de
Software
openresty/1.19.3.1 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

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

Response headers

Date
Sun, 31 Jan 2021 22:14:49 GMT
Last-Modified
Wed, 07 Aug 2019 15:27:25 GMT
Server
openresty/1.19.3.1
ETag
"5d4aeddd-18"
Access-Control-Allow-Methods
GET
Content-Type
application/octet-stream
Access-Control-Allow-Credentials
true
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame 656D
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
fc59aa6a09c5a467434baca733aa75d1b754cd19ce976336a9495e49b3a33a3a

Request headers

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

Response headers

Content-Type
text/javascript
/
ssl.2.damoh.tvtoday.de/99ecb2e91da14b1cd6c33d1d6e51be4ea2e2d2e1/
112 B
680 B
XHR
General
Full URL
https://ssl.2.damoh.tvtoday.de/99ecb2e91da14b1cd6c33d1d6e51be4ea2e2d2e1/
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.3.103 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.103.3.251.148.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
7a625d2dfdc959f77d95c2f8460330b62b1567d49c94e647bf84923ed18f3ddc

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Sun, 31 Jan 2021 22:14:49 GMT
Server
TornadoServer/5.0
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
https://www.tvtoday.de
Access-Control-Expose-Headers
Date, X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Content-Length
112
546a818fe4b03c03eae5f0fb_245.webp
images.tvtoday.de/itv/2021-01-31/
3 KB
3 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-31/546a818fe4b03c03eae5f0fb_245.webp
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
39639f6cc05c01cdd5bbc46a4d8537a8ace4ca5d7d4748f750c5a01a1e103f60
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:10:59 GMT
last-modified
Mon, 18 Jan 2021 03:33:01 GMT
age
229
etag
"bf6-5b924610a1ec6"
vary
x-requested-with
x-varnish
942305237 945161613
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/webp
5645143cea60e556a32f3945_245.webp
images.tvtoday.de/itv/2021-01-31/
2 KB
2 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-31/5645143cea60e556a32f3945_245.webp
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
bcc1736fd29d39bf5d51b8d2abe1b44bc9ff9d0a92173fab01b4fec6c3da2177
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:11:21 GMT
last-modified
Mon, 18 Jan 2021 04:01:13 GMT
age
207
etag
"84a-5b924c5e84b89"
vary
x-requested-with
x-varnish
944844373 941617034
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/webp
600afc6c8189651233c40cf0_245.webp
images.tvtoday.de/itv/2021-01-31/
7 KB
8 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-31/600afc6c8189651233c40cf0_245.webp
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
9f07c7e7d58f280125062eb72ef2dbf4d8a8389893d226ff7ddbc2e937feb18e
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:06:33 GMT
last-modified
Sat, 23 Jan 2021 03:50:40 GMT
age
495
etag
"1d70-5b989355bdc23"
vary
x-requested-with
x-varnish
953868994 955111787
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/webp
5645143cea60e556a32f3945_245.webp
images.tvtoday.de/itv/2021-01-31/
2 KB
2 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-31/5645143cea60e556a32f3945_245.webp
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/app/js/main.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
bcc1736fd29d39bf5d51b8d2abe1b44bc9ff9d0a92173fab01b4fec6c3da2177
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:03:33 GMT
last-modified
Mon, 18 Jan 2021 04:01:13 GMT
age
4276
etag
"84a-5b924c5e84b89"
vary
x-requested-with
x-varnish
953868995 953507085
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/webp
600af9138189651233c3da99_245.webp
images.tvtoday.de/itv/2021-01-31/
5 KB
6 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-31/600af9138189651233c3da99_245.webp
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
9ecf94db6de8204eea45e6ca45603bec669dc6e76afadf83fd9ed6819e199d94
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:09:15 GMT
last-modified
Sat, 23 Jan 2021 03:50:43 GMT
age
334
etag
"151a-5b989358e55b3"
vary
x-requested-with
x-varnish
941678418 942339407
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/webp
568266ffd945a6a268005d9010160416_245.webp
images.tvtoday.de/itv/2021-01-31/
12 KB
12 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-31/568266ffd945a6a268005d9010160416_245.webp
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
6927d25bd2da5914dcffb5c654c98b5daf53880db73be6dedc99325cd9b1860a
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:09:14 GMT
last-modified
Mon, 18 Jan 2021 04:01:17 GMT
age
334
etag
"2f3a-5b924c623be14"
vary
x-requested-with
x-varnish
912421678 937442596
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/webp
/
ssl.2.damoh.tvtoday.de/33085e8071300a849312b4e716d9f21b2b7a75db/
108 B
676 B
XHR
General
Full URL
https://ssl.2.damoh.tvtoday.de/33085e8071300a849312b4e716d9f21b2b7a75db/
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.3.103 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.103.3.251.148.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
335e2e2388b14739ed9aafc1a3a63ec15fd85fd51b3462f4fd41f72f55ea9c71

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Sun, 31 Jan 2021 22:14:49 GMT
Server
TornadoServer/5.0
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
https://www.tvtoday.de
Access-Control-Expose-Headers
Date, X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Content-Length
108
548870ade4b0c01470685993_245.webp
images.tvtoday.de/itv/2021-01-31/
6 KB
6 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-31/548870ade4b0c01470685993_245.webp
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
e4aecc72e7af8a4c61f3248d2e220a037f2b85d089071938b604f161d9a41097
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:11:17 GMT
last-modified
Mon, 18 Jan 2021 03:51:11 GMT
age
212
etag
"182c-5b924a2004364"
vary
x-requested-with
x-varnish
912421680 940933118
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/webp
5645143cea60e556a32f3945_780.jpg
images.tvtoday.de/itv/2021-01-31/
16 KB
16 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-31/5645143cea60e556a32f3945_780.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
022071ff97e143c520629ac14e6c728ec5694d76c2781986cacf5ebd84d21fa4
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:18:37 GMT
last-modified
Mon, 18 Jan 2021 04:01:14 GMT
age
3372
etag
"3ede-5b924c5ee0079"
vary
x-requested-with
x-varnish
944487837 917299019
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
568266ffd945a6a268005d9010160416_780.jpg
images.tvtoday.de/itv/2021-01-31/
69 KB
69 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-31/568266ffd945a6a268005d9010160416_780.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
f1551db91ce6442d6cd5a32304a7c30b4fcef27311a69fbf2a9075c184674446
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:11:20 GMT
last-modified
Mon, 18 Jan 2021 04:01:18 GMT
age
208
etag
"11340-5b924c62ac6d2"
vary
x-requested-with
x-varnish
954578244 929612275
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
600b30868189651233c618b7_780.jpg
images.tvtoday.de/itv/2021-01-31/
27 KB
28 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-31/600b30868189651233c618b7_780.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
ac33af21d95293efd64bed77fa2d9092741cfc61a6e89e4c78be6758411d0370
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 21:19:19 GMT
last-modified
Sun, 24 Jan 2021 03:42:00 GMT
age
3330
etag
"6dbd-5b99d34364ffb"
vary
x-requested-with
x-varnish
952660474 951920370
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
600b230c8189651233c5938e_780.jpg
images.tvtoday.de/itv/2021-01-31/
30 KB
30 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-31/600b230c8189651233c5938e_780.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
e92082c8e27af39c7cd85b6f34e8b25169e208d519e824cf92b22fb83a175bc4
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Sun, 31 Jan 2021 22:13:14 GMT
last-modified
Sun, 24 Jan 2021 03:44:35 GMT
age
95
etag
"773f-5b99d3d771e68"
vary
x-requested-with
x-varnish
927965355 943242285
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg

Verdicts & Comments Add Verdict or Comment

151 JavaScript Global Variables

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

object| 0 object| 1 object| 2 object| ontransitionrun object| ontransitionstart object| ontransitioncancel object| cookieStore function| showDirectoryPicker function| showOpenFilePicker function| showSaveFilePicker object| trustedTypes boolean| crossOriginIsolated object| lazySizesConfig function| __tcfapi number| SOURCEPOINT_ID boolean| tcfAllowedReload object| _sp_ function| getParameterByName boolean| mobileRedirect object| mobileParam object| _deq number| horAdCounter number| verAdCounter number| oopAdCounter string| adHomadUnit object| _aeq function| loadKameleoon function| createAnalytics function| sendViewAnalytics function| reloadGAStats number| googleAnalyticsCookieLifetime string| GoogleAnalyticsObject function| ga boolean| displayCleverpush function| resetGoogleAnalytics function| initGoogleAnalytics function| loadCleverpush object| vendors function| BKJEQdd function| UABPreloaded object| elcjgCln object| elcjgClne object| elcjgClni boolean| elcjglsn object| elcjga6aFlags string| elcjg6b5Rnd boolean| elcjgnpm boolean| videoScriptIsAlreadyExecuted function| UABPVreloaded object| elcjgddfdtc object| el1 object| el2 boolean| TftAdEngineBlocked function| adEngineCheck object| dataLayer function| loadHotjar string| szmvars object| iom object| iam_data object| iam_data_video object| iam_data_text function| reloadIam function| reloadIamVideo function| reloadIamText function| whenDefined object| _deqOptions object| google_tag_data object| gaplugins object| gaGlobal object| gaData object| html5 object| Modernizr function| tfmvideopkg_getUrlParam boolean| tfmvideodebug boolean| tfmplayerdebug object| tfmvideopkg_internal_script_config boolean| playerAsync undefined| param string| imaURL object| imaScript object| head function| tfmsuite function| VideoPlayerQueue function| $ function| jQuery object| google object| google_tag_manager function| setImmediate function| clearImmediate object| regeneratorRuntime object| pbjs object| _pbjsGlobals object| core function| addEventHandler boolean| DONOTLOADAE function| adDetection function| testWebPSupport function| require function| requirejs function| define boolean| elcjg45fsdl boolean| elcjg45fsdln string| elcjgddfdgenat string| elcjgddfdsthash string| elcjgddfdDomain boolean| elcjgc08forceimp object| elcjgsc number| maxscrolled boolean| elcjg01bBody boolean| elcjg2b2Detect object| elcjg6a7Mobile object| elcjgddfd1 object| elcjgddfdo1 object| elcjgddfdo2 object| elcjgddfdo3 object| elcjgddfd2 number| elcjgddfdd3 object| elcjgddfd4 object| elcjgddfd5 boolean| elcjgdeeij object| _google_rum_ns_ object| google_persistent_state_async number| google_global_correlator object| google_js_reporting_queue number| google_srt function| mb function| Goog_AdSense_Lidar_sendVastEvent function| Goog_AdSense_Lidar_getViewability function| Goog_AdSense_Lidar_getUrlSignalsArray function| Goog_AdSense_Lidar_getUrlSignalsList object| module$contents$ima$CompanionAdSelectionSettings_CompanionAdSelectionSettings object| ima object| module$contents$ima$AdsRenderingSettings_AdsRenderingSettings object| module$contents$ima$AdCuePoints_AdCuePoints object| module$contents$ima$AdError_AdError object| module$contents$ima$AdErrorEvent_AdErrorEvent object| module$contents$ima$AdEvent_AdEvent object| module$contents$ima$AdsManagerLoadedEvent_AdsManagerLoadedEvent object| _google undefined| _oldVPQueue object| _vpq function| calculateDay function| homadAdTag object| exportz undefined| _ object| lazySizes undefined| Backbone boolean| elcjg380Track object| kf function| videopkgInterface string| hic_qos

13 Cookies

Domain/Path Name / Value
.tvtoday.de/ Name: iom_consent
Value: 0100000000&1612131288005
.tvtoday.de/ Name: consentUUID
Value: c0250da6-b372-4d63-9d46-5ad069eb81f8
www.tvtoday.de/ Name: _sp_v1_lt
Value: 1:
www.tvtoday.de/ Name: _sp_v1_csv
Value: null
www.tvtoday.de/ Name: _sp_v1_opt
Value: 1:
.tvtoday.de/ Name: _gat
Value: 1
www.tvtoday.de/ Name: _sp_v1_consent
Value: 1!0:-1:-1:-1:-1:-1
www.tvtoday.de/ Name: _sp_v1_ss
Value: 1:H4sIAAAAAAAAAItWqo5RKimOUbKKxs_IAzEMamN1YpRSQcy80pwcILsErKC6lpoSSrEA-EAOLpYAAAA%3D
www.tvtoday.de/ Name: _sp_v1_data
Value: 2:260302:1612131287:0:1:0:1:0:0:_:-1
.tvtoday.de/ Name: ioam2018
Value: 0016b6eff25a0c99b60172bd7:1641334487546:1612131287546:.tvtoday.de:2:tvspielf:D/T/R/H/W/-/-/Thema_Entertainment_tvtoday:noevent:1612131287546:dtvc6f
www.tvtoday.de/ Name: _sp_v1_uid
Value: 1:726:0c836d7e-db4a-4fc5-9d95-4ea6ab305972
.tvtoday.de/ Name: _gid
Value: GA1.2.289073915.1612131288
.tvtoday.de/ Name: _ga
Value: GA1.2.1781516874.1612131288

10 Console Messages

Source Level URL
Text
console-api log URL: https://www.tvtoday.de/(Line 80)
Message:
mobileAlternate: https://m.tvtoday.de/
console-api log URL: https://www.tvtoday.de/(Line 468)
Message:
TftAdEngineBlocked:: false
console-api log URL: https://www.tvtoday.de/(Line 541)
Message:
IAM: {"st":"tvspielf","cp":"D/T/R/H/W/-/-/Thema_Entertainment_tvtoday","sv":"ke","sc":"yes"}
console-api log URL: https://www.tvtoday.de/(Line 360)
Message:
Reload: true
console-api log URL: https://cdn.privacy-mgmt.com/wrapperMessagingWithoutDetection.js(Line 1)
Message:
Messaging without detection successfully executed.
console-api log URL: https://www.tvtoday.de/app/js/main.js(Line 72)
Message:
RW: init sliders
console-api log URL: https://www.tvtoday.de/app/js/main.js(Line 72)
Message:
RW: init sliders
console-api log URL: https://www.tvtoday.de/app/js/main.js(Line 69)
Message:
checking width... false
console-api log URL: https://www.tvtoday.de/(Line 4355)
Message:
AdBlockerNotDetected
console-api log URL: https://www.tvtoday.de/app/js/main.js(Line 72)
Message:
homead ready

Security Headers

This page lists any security headers set by the main page. If you want to understand what these mean and how to use them, head on over to this page

Header Value
Strict-Transport-Security max-age=15768000

Indicators

This is a term in the security industry to describe indicators such as IPs, Domains, Hashes, etc. This does not imply that any of these indicate malicious activity.

a.bf-ad.net
a.bf-tools.net
a2.tvspielfilm.de
cdn.privacy-mgmt.com
cmp.tvtoday.de
d2p3zdq8vjvnxd.cloudfront.net
de.ioam.de
hgc-cf-cache-1.svonm.com
images.tvtoday.de
p5.focus.de
s0.2mdn.net
s3.amazonaws.com
script.ioam.de
ssl.1.damoh.tvtoday.de
ssl.2.damoh.tvtoday.de
stats.g.doubleclick.net
tvtoday.de
uobsoe.com
www.google-analytics.com
www.googletagmanager.com
www.tvtoday.de
136.243.25.120
143.204.93.103
143.204.93.40
148.251.3.103
151.106.72.75
2.20.143.13
2600:9000:206f:ac00:13:7ad6:7840:21
2a00:1450:4001:811::2008
2a00:1450:4001:811::200e
2a00:1450:4001:816::2006
2a00:1450:400c:c00::9a
2a02:26f0:6c00::210:bab2
2a02:26f0:6c00::210:bb29
52.216.17.35
65.9.58.127
78.46.33.212
91.215.103.64
91.215.103.65
022071ff97e143c520629ac14e6c728ec5694d76c2781986cacf5ebd84d21fa4
03da065f9be8acf8e981c2e0d36522bdbfc47decc9fe5b8d4fb4fb404a5ec43a
07effd27c24e20b1fc30659b8b771d95c785ab4d3dc3dedaccfcfbfd95b435e6
0a5831440f66b5fdb994c860ca64e766c421c79c504ba57f1dcf5b49c85c52c0
103f77ffb505419ca5a6e4a8b74d9398f58ed76e484002911fd94e5796075bbb
11e4124c9c8b37459ba4728d36dbbd9b5e6bf92683e24702001f922ddceace00
12bfeecd8c7ec4be87b778077faea6a53e86fa5a0caf36e67bc8e4d63dd0edf3
17b83f6abf2bd24ee17266a0d2d17f44b5a328414e236d1a2bb6268440fb6d89
19d502b1c90d16b4132b9b01229277607cd18150518ec92a806c475a7426238b
1d5b7c64458f4af91dcfee0354be47adde1f739b5aded03a7ab6068a1bb6ca97
21441371e6406b1ab2d3343a03fe2c6a3514739dd3f47036af6ad706d872b311
22f138e2189f2659b3f920aaf4cb81963493984091199acf38dbb3db7be3235d
28645074de9b2587a42c2317b5876b375d933409b068567bb62d26e7316f6510
2fcbe9ed682b16557f66e6fd4e7fa33b647eb54f921f4a3c37c526fb30ba45ab
30da2bff9b5cb0f94b04c9c21ec607dfb1b46cf706802a093185036b333f89e6
327056aff8450506523ea2f4df99b4a24f01d77f2824706c0e01c28a3b11428e
331b05ab63a9fc51ff711345c41007cd9e450ab4ba93d623d2455df04878e5b9
335e2e2388b14739ed9aafc1a3a63ec15fd85fd51b3462f4fd41f72f55ea9c71
35539ddad96cfb13bb97b51fde24fbb89329480259928e0190d754a70bbe3ed9
39639f6cc05c01cdd5bbc46a4d8537a8ace4ca5d7d4748f750c5a01a1e103f60
3b7b8a4b411ddf8db9bacc2f3aabf406f8e4c0c087829b336ca331c40adfdff1
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
447b290e7282540ce73a197fc7583f6f3baad9e1b622e1febf215398e523b7bc
471b15c341415f023cd5387eb0bd4626883d010312f7b2a12f184613bda3f7df
4c19e27257577988274813ad04b681ae1cc446201a8e36dc20f8d3022fa92257
4dd67b29cc3e3eb840d0dce2c9088000e06b21134aabb021f2a2f98e5dc124b8
4fd413be818cadcb46c36f2bc05d65d5970a6b1b29bf01021a1609151b9810ee
50e59b43cf21b2bf563fb5778b6e4f358e698a0438b5a1098edd4d35be7ce4d9
533b23c57b1770cc3ee9c15b998b2eb494fa0adb2d6929fd22a9b78adfade3a7
53a653cd123dfae9383c014be06ee2a27d8c32b325d9ac7d96a55c3f2969a960
62214dab0c26ba36487bfa2d0498b0931ca9c8e20a2864b55ff509e3876d8692
6668173a26e386c46c209eb428bb5c71223725118705f1cec27961e76a87542c
6927d25bd2da5914dcffb5c654c98b5daf53880db73be6dedc99325cd9b1860a
6af654da3487974cabaad7ae8d273e5ee3b6e5adb8c1f8bc74b2a01b57bf16b0
6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
7a2e7a80d7542d5e8ae0beeb3abd52a5f0346c99cca5ffa4c0f222699abfe64d
7a625d2dfdc959f77d95c2f8460330b62b1567d49c94e647bf84923ed18f3ddc
7b2ee61bcca53f60642717b52fbd8c07d37d0cd5459d9601abafe9ae10ab2c18
7d2f2875cdf32b9c50856aba00226b12b9b0c6a6af0862d734636b53a622375d
7fbc6e423bc418ef72eb926ea7cf3f00fcf85a0dfa0214f75f3d33d982e27bd3
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
85cda4d55bcace5081124025c8f8a4d9ed4bebc5ef464e9aa880c84f7cb9783c
8d60669fddbf6b72a2e5fc8c13da74bbf90d1ea5da6676e058346414a14f2d55
9123226279b709b6da55233220826f2b547d859f2d3345a8692b463c6241ba95
921ecfdbc7b2b862099cb55dd98e60d5eb25213ab39de4b32f8d98f2e06286a0
9b2f485ce1c23140b096566bd4e3921f6760033433d1313167ebda10d04ac172
9ce49a6036072f670176d60dfcd39ccfb8458af1f72af91cf028ef7d8c81570a
9d70d6b5316518c3a8856a3655156437e00baefd015180efabc83cd42302cced
9ecf94db6de8204eea45e6ca45603bec669dc6e76afadf83fd9ed6819e199d94
9f07c7e7d58f280125062eb72ef2dbf4d8a8389893d226ff7ddbc2e937feb18e
a1d3db8192b827a383ef379c9098656bc3c1d8fc7f7a4f92dbfd6d53ccc98378
ac33af21d95293efd64bed77fa2d9092741cfc61a6e89e4c78be6758411d0370
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
aec60bc104db041b1512185839f18f52986df7e569e5445f740dd60f763fbca8
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277
b099ee6a5d30b54ef508de7ddfb2a78cd440ba624d27ed7d8b3f9a855f7d3de7
ba978af8a14e6a1abc2112e0e981ed4d1bdaaac1aa643ec12effe21f14eb983e
bcc1736fd29d39bf5d51b8d2abe1b44bc9ff9d0a92173fab01b4fec6c3da2177
be726dcabb9c264b1d1816ec0da60cb11fbb9b76afee12a82683d808a62a810c
bf6433080882816ede69d3317d486fa7fd2b63995f0e3bc7971465221e058c99
c011fb98df01432b65f1566109bf13d604858bc3d765cb3482e24e98cdd6e92f
c89104ea547c4d58aeb92299465633b25ee3c1c9348c0e0b5ec471a34588c1c6
c90cff659645a312a28804965f3dbc34061338f7234ff5d6ddb2c57e9eadec15
d0281adaf991fe6241587cd3bc4d545fe8b44c00705137a6994b15724f88a0c6
d033f3bf9adb39b1aded5345a6731e4cf70ef85f0019b32464ebe55714c5a4cd
d4139cbcf4017cb369059548b41fe657c0d0c24284cd3192f073a0d65059fa69
d7414b3a412e2829b3c6a846fbf3038ee39bb472d77fba00a79632d41c2fea88
dd11699e5bc91d667cc55e032cf45a9e599f3cebc0e3f71e2539e97ca8703d1f
ddfa922e4f9fcd81cf6ab8c51707fe681cf1001ad918e793eabeea5d8b2c6967
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e441c3e2771625ba05630ab464275136a82c99650ee2145ca5aa9853bedeb01b
e4aecc72e7af8a4c61f3248d2e220a037f2b85d089071938b604f161d9a41097
e83b8ec23b952200c3ba4729bfbac3b4379e66de48a31ca39c255fa7201ea65a
e8aaebf9f69815ea93b6beff9b78806dacc9bcbf2a25eeee2297d5a95f1e2431
e92082c8e27af39c7cd85b6f34e8b25169e208d519e824cf92b22fb83a175bc4
f1551db91ce6442d6cd5a32304a7c30b4fcef27311a69fbf2a9075c184674446
f56e62cc728881f7a85d94b689685f0095106ae0b3a8a344709abcefcea262fc
fc59aa6a09c5a467434baca733aa75d1b754cd19ce976336a9495e49b3a33a3a
fdcb7fa1bc76eb0697f35276b4b7a9a0474a9cd6ce0d64db8d055a673473ac86