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

Summary

This website contacted 20 IPs in 4 countries across 15 domains to perform 71 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 43 151.106.72.75 61157 (PLUSSERVE...)
1 13.224.94.116 16509 (AMAZON-02)
2 2.16.186.73 20940 (AKAMAI-ASN1)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 91.215.100.39 43407 (INFONLINE-AS)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
2 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)
1 2a00:1450:400... 15169 (GOOGLE)
6 65.9.7.35 16509 (AMAZON-02)
1 136.243.25.11 24940 (HETZNER-AS)
2 52.217.10.246 16509 (AMAZON-02)
2 143.204.93.40 16509 (AMAZON-02)
3 148.251.89.206 24940 (HETZNER-AS)
1 2600:9000:219... 16509 (AMAZON-02)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 78.46.33.212 24940 (HETZNER-AS)
71 20
Domain Requested by
24 images.tvtoday.de www.tvtoday.de
18 www.tvtoday.de www.tvtoday.de
6 cmp.tvtoday.de www.tvtoday.de
cmp.tvtoday.de
3 ssl.3.damoh.tvtoday.de 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 www.google-analytics.com 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
1 s0.2mdn.net www.tvtoday.de
1 stats.g.doubleclick.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
71 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-01 -
2021-04-01
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
2020-12-15 -
2021-03-09
3 months crt.sh
*.g.doubleclick.net
GTS CA 1O1
2020-12-15 -
2021-03-09
3 months crt.sh
*.doubleclick.net
GTS CA 1O1
2020-12-15 -
2021-03-09
3 months crt.sh
cmp.bestcheck.de
R3
2020-12-10 -
2021-03-10
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
ssl.1.damoh.tvtoday.de
R3
2020-12-03 -
2021-03-03
3 months 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

This page contains 3 frames:

Primary Page: https://www.tvtoday.de/
Frame ID: D7C84776B744AF47C1F417FEB0A2713C
Requests: 77 HTTP requests in this frame

Frame: https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&preload_message=true&consentLanguage=de
Frame ID: C82595AF14D74D285D544143C09DE56E
Requests: 6 HTTP requests in this frame

Frame: data://truncated
Frame ID: F3DE62A68B0368C83A5C558A5CB07230
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

71
Requests

100 %
HTTPS

42 %
IPv6

15
Domains

21
Subdomains

20
IPs

4
Countries

1561 kB
Transfer

4351 kB
Size

4
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 24
  • https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&ct=01000000000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=0013&i2=00138eb47253bf4865ffcf3d1&ep=1640685512&vr=418&id=b3ypd5&i3=00138eb47253bf4865ffcf3d1%3A1638320209800%3A1610413009800%3A.tvtoday.de%3A1%3Atvspielf%3AD%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday%3Anoevent%3A1610413009800&n1=1&dntt=0&lt=1610413009801&ev=&cs=gb5qpa&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=01000000000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=0013&i2=00138eb47253bf4865ffcf3d1&ep=1640685512&vr=418&id=b3ypd5&i3=00138eb47253bf4865ffcf3d1%3A1638320209800%3A1610413009800%3A.tvtoday.de%3A1%3Atvspielf%3AD%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday%3Anoevent%3A1610413009800&n1=1&dntt=0&lt=1610413009801&ev=&cs=gb5qpa&mo=1&sr=71

71 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.tvtoday.de/
Redirect Chain
  • http://tvtoday.de/
  • https://www.tvtoday.de/
656 KB
69 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
f030078824011bb1050beac05088f511e35e2c149af10ee659e94ef1c5cd04b9
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
Tue, 12 Jan 2021 00:43:29 GMT
strict-transport-security
max-age=15768000
content-type
text/html; charset=UTF-8
last-modified
Tue, 12 Jan 2021 00:43:29 GMT
cache-control
max-age=901, public
x-varnish
447597547 508230238 507147288
content-encoding
br
age
799
vary
x-requested-with,Accept-Encoding
accept-ranges
bytes

Redirect headers

Date
Mon, 11 Jan 2021 23:23:50 GMT
Location
https://www.tvtoday.de/
Content-Type
text/html; charset=iso-8859-1
Last-Modified
Mon, 11 Jan 2021 23:23:50 GMT
Cache-Control
public, max-age=7200
Content-Encoding
gzip
X-Varnish
506312553 505463521
Age
5579
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.48
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
Tue, 12 Jan 2021 00:24:48 GMT
content-encoding
br
last-modified
Tue, 01 Dec 2020 10:41:49 GMT
age
1920
etag
W/"4e521-5b564c62cf71c-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
508634660 512527982, 508230239 503001823
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
text/css
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
Tue, 12 Jan 2021 00:28:41 GMT
content-encoding
br
last-modified
Wed, 30 Jan 2019 08:45:19 GMT
age
1687
etag
W/"3bf0-580a8ee00d4d3-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
503310329 507189857, 503798367 504446004
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
Tue, 12 Jan 2021 00:24:48 GMT
content-encoding
br
last-modified
Wed, 30 Jan 2019 08:45:19 GMT
age
1921
etag
W/"3b94-580a8ee00a5f0-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
505375508 511288869, 498954304 511260215
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
Tue, 12 Jan 2021 00:23:33 GMT
content-encoding
br
last-modified
Wed, 30 Jan 2019 08:45:19 GMT
age
1995
etag
W/"3c4c-580a8ee00bd67-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
507482765 504638147, 504736880 497942080
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/
147 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
13.224.94.116 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-224-94-116.zrh50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
9ee4550acb406ec171b67dcab98a2b4f184ba91831dad9ccf9551536029f71f0

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
Tue, 12 Jan 2021 00:36:45 GMT
content-encoding
gzip
last-modified
Thu, 17 Dec 2020 17:54:42 GMT
server
AmazonS3
age
1205
etag
W/"ac96b30caab2bae5b639f45d0bb0e3dc"
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
via
1.1 9349ae4f82564896b96f5303b030d189.cloudfront.net (CloudFront)
cache-control
max-age=3600
x-amz-cf-pop
ZRH50-C1
x-amz-cf-id
i9Y3tK6Pl3PD8n2Ll7PuL5bU55r8s1PO5w4_iuj_xSiQ8OIqKypxEA==
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.16.186.73 , Ascension Island, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-186-73.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=934990, s-maxage=2592001
date
Tue, 12 Jan 2021 00:56:49 GMT
accept-ranges
bytes
content-length
3052
expires
Fri, 22 Jan 2021 20:39:59 GMT
46cfa08.js
www.tvtoday.de/js/
16 KB
5 KB
Script
General
Full URL
https://www.tvtoday.de/js/46cfa08.js?10.48
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
Tue, 12 Jan 2021 00:24:26 GMT
content-encoding
br
last-modified
Thu, 15 Nov 2018 08:42:47 GMT
age
1942
etag
W/"402e-57ab008ffeede-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
502463301 505385660, 504736881 507483278
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:bab8 , Ascension Island, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
e886f98399d528aca71bfbe8e78396745d4c491ec04dd627d15a845b06d39cb4

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
Tue, 12 Jan 2021 00:56:49 GMT
content-encoding
gzip
last-modified
Tue, 15 Dec 2020 10:01:42 GMT
server
AkamaiNetStorage
etag
"bfb740f2bc6adb61976ebfe1a0608556:1608026635.806505"
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
Tue, 12 Jan 2021 01:11:49 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
Tue, 12 Jan 2021 00:09:12 GMT
content-encoding
br
last-modified
Tue, 12 Jan 2021 00:00:01 GMT
age
2857
etag
W/"2589f-5b8a8b43c7064-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
507609094, 505314710 501446701
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.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.13 0013
Resource Hash
84e35c03e3a98c13a159b3d80c3d71d3cc9c625a7b25bf1d24138ae82caadbec

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
Tue, 12 Jan 2021 00:56:49 GMT
Content-Encoding
gzip
Last-Modified
Tue, 12 Jan 2021 00:56:49 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.13 0013
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
Tue, 12 Jan 2021 02:56:49 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.48
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
Tue, 12 Jan 2021 00:29:55 GMT
last-modified
Fri, 02 Nov 2018 07:42:43 GMT
age
1613
etag
"9557-579a9ae471290"
vary
x-requested-with
x-varnish
498954311 512395388
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
Tue, 12 Jan 2021 00:34:31 GMT
last-modified
Fri, 27 Jul 2018 13:22:05 GMT
age
1338
etag
"1ac3-571faff7af5a0"
vary
x-requested-with
x-varnish
506312560 507742773
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
Tue, 12 Jan 2021 00:16:47 GMT
last-modified
Fri, 20 Jul 2018 21:32:02 GMT
age
2401
etag
"327c-5717506c7e98c"
vary
x-requested-with
x-varnish
510704906 510373251
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.48
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
Tue, 12 Jan 2021 00:37:07 GMT
last-modified
Wed, 18 Jul 2018 10:43:07 GMT
age
1182
etag
"1148-57143ba5eda4c"
vary
x-requested-with
x-varnish
511445624 512659975
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/png
5fd3a05e8189656084da4b14_780.jpg
images.tvtoday.de/itv/2021-01-12/
33 KB
33 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-12/5fd3a05e8189656084da4b14_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
e8ba645d16c5d536f8972f469073ef79605040e36d933d1cca13e763b70f198e
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
Tue, 12 Jan 2021 00:38:15 GMT
last-modified
Tue, 29 Dec 2020 10:22:38 GMT
age
1114
etag
"8309-5b797c51c73e3"
vary
x-requested-with
x-varnish
511395116 510420235
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
Mon, 11 Jan 2021 23:57:39 GMT
last-modified
Thu, 27 Feb 2020 09:18:15 GMT
age
3550
etag
"5673-59f8b33716667"
vary
x-requested-with
x-varnish
506765651 506829837
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
Tue, 12 Jan 2021 00:20:58 GMT
last-modified
Thu, 27 Feb 2020 09:18:15 GMT
age
2151
etag
"3fef-59f8b33717dd4"
vary
x-requested-with
x-varnish
504736882 507611742
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
Tue, 12 Jan 2021 00:35:59 GMT
last-modified
Thu, 27 Feb 2020 09:19:29 GMT
age
1249
etag
"4567-59f8b37d9a5d1"
vary
x-requested-with
x-varnish
507254498 503892979
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
Tue, 12 Jan 2021 00:52:10 GMT
last-modified
Thu, 27 Feb 2020 09:19:29 GMT
age
279
etag
"260b-59f8b37d9f3ef"
vary
x-requested-with
x-varnish
511395117 506910687
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
Mon, 11 Jan 2021 23:57:30 GMT
last-modified
Thu, 27 Feb 2020 09:21:36 GMT
age
3559
etag
"2fc9-59f8b3f674d7f"
vary
x-requested-with
x-varnish
511395118 511131002
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
Tue, 12 Jan 2021 00:43:30 GMT
last-modified
Thu, 27 Feb 2020 09:21:36 GMT
age
799
etag
"3ced-59f8b3f67e5d4"
vary
x-requested-with
x-varnish
502267769 507774245
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
75b5a9a9a007dc34d12f2cbe511e11f65859da6e0821ae76ca24340fa20ae058

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
Tue, 12 Jan 2021 00:56:49 GMT
content-encoding
gzip
last-modified
Thu, 10 Dec 2020 10:02:23 GMT
server
AkamaiNetStorage
etag
"dba376ac05c91e2d0fe1715c4df460b7:1607594546.171"
vary
Accept-Encoding
content-type
application/x-javascript
cache-control
max-age=900
accept-ranges
bytes
content-length
3871
expires
Tue, 12 Jan 2021 01:11:49 GMT
analytics.js
www.google-analytics.com/
46 KB
18 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:808::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
5837
date
Mon, 11 Jan 2021 23:19:32 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
Tue, 12 Jan 2021 01:19:32 GMT
gtm.js
www.googletagmanager.com/
115 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:808::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
396bd5624aa1984ef709feb67743e3a5557e1e9633ef9ddeae5d0a17fe803a85
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
Tue, 12 Jan 2021 00:56:49 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
39493
x-xss-protection
0
last-modified
Tue, 12 Jan 2021 00: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
Tue, 12 Jan 2021 00:56:49 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=01000000000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=NL%2F...
  • https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&ct=01000000000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=NL%2F...
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=01000000000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=0013&i2=00138eb47253bf4865ffcf3d1&ep=1640685512&vr=418&id=b3ypd5&i3=00138eb47253bf4865ffcf3d1%3A1638320209800%3A1610413009800%3A.tvtoday.de%3A1%3Atvspielf%3AD%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday%3Anoevent%3A1610413009800&n1=1&dntt=0&lt=1610413009801&ev=&cs=gb5qpa&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 0042
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
Tue, 12 Jan 2021 00:56:49 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.06.2 0042
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
Tue, 12 Jan 2021 00:56:49 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.06.2 0042
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
Tue, 12 Jan 2021 00:56:49 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=01000000000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=0013&i2=00138eb47253bf4865ffcf3d1&ep=1640685512&vr=418&id=b3ypd5&i3=00138eb47253bf4865ffcf3d1%3A1638320209800%3A1610413009800%3A.tvtoday.de%3A1%3Atvspielf%3AD%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday%3Anoevent%3A1610413009800&n1=1&dntt=0&lt=1610413009801&ev=&cs=gb5qpa&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
Sun, 12 Jan 2020 00:56:49 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
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.48
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.48
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
Tue, 12 Jan 2021 00:39:58 GMT
last-modified
Thu, 18 Jul 2019 12:45:49 GMT
age
1011
etag
"42fc-58df3fd40da22"
vary
x-requested-with
x-varnish
507025605 499936147
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
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=1041689629&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=841521629&gjid=1476545192&cid=1514907126.1610413010&tid=UA-1909021-1&_gid=1790450104.1610413010&_r=1&_slc=1&cd4=0&z=1605017735
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:808::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
Tue, 12 Jan 2021 00:56:49 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
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
Tue, 12 Jan 2021 00:54:03 GMT
last-modified
Fri, 24 Nov 2017 21:12:05 GMT
age
166
etag
"3a72-55ec101392411"
vary
x-requested-with
x-varnish
502267770 503833996
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
Tue, 12 Jan 2021 00:43:56 GMT
last-modified
Tue, 29 Jan 2019 11:05:01 GMT
age
773
etag
"1013-58096c3c68a2d"
vary
x-requested-with
x-varnish
499764787 512819782
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
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
2b652e5.js
www.tvtoday.de/js/
25 KB
8 KB
Script
General
Full URL
https://www.tvtoday.de/js/2b652e5.js?10.48
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
Tue, 12 Jan 2021 00:34:31 GMT
content-encoding
br
last-modified
Thu, 15 Nov 2018 08:42:47 GMT
age
1338
etag
W/"6449-57ab008ffd773-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
497970657 499541933, 507134207 499542114
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
application/javascript
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=1514907126.1610413010&jid=841521629&gjid=1476545192&_gid=1790450104.1610413010&_u=YEBAAEAAAAAAAC~&z=1452965241
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::9b 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
Tue, 12 Jan 2021 00:56:49 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
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:825::2006 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
2a8a8d92be36ceebd55820a80c0d7618432572c506e503232ddf2f39249a26fa
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
Tue, 12 Jan 2021 00:56:50 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
111351
x-xss-protection
0
expires
Tue, 12 Jan 2021 00:56:50 GMT
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
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=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&hasCsp=true&env=prod&consentLanguage=de&body=%7B%22accountId%22%3A217%2C%22requestUUID%22%3A%224f8d0acd-2e8a-4dcb-86a8-c0453f2ed591%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.7.35 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
Tue, 12 Jan 2021 00:56:50 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
x-cache
Miss from cloudfront
via
1.1 c2b4a332b09677da722930ae336c8bfc.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C1
x-amz-cf-id
zSYTiby46nmlrPrFnKvno0RI4G8QwPakyn_1Yg-A-14KkXzEgjwRJw==
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=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&hasCsp=true&env=prod&consentLanguage=de&body=%7B%22accountId%22%3A217%2C%22requestUUID%22%3A%224f8d0acd-2e8a-4dcb-86a8-c0453f2ed591%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.7.35 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
/ Express
Resource Hash
5ad41f43166b293e1185b60b01a3a4247cfe8ac889b339df3de215f2f7934d8a

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
Tue, 12 Jan 2021 00:56:50 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
_KmCg2hyxfELGs5AyAIh973VKdbdypqvII6A8spnXM_AbXFHrBxDdg==
via
1.1 c2b4a332b09677da722930ae336c8bfc.cloudfront.net (CloudFront)
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.16.186.73 , Ascension Island, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-186-73.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=591150, s-maxage=2592001
date
Tue, 12 Jan 2021 00:56:50 GMT
accept-ranges
bytes
content-length
206598
config.js
www.tvtoday.de/app/js/
827 B
555 B
Script
General
Full URL
https://www.tvtoday.de/app/js/config.js?10.48
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
Tue, 12 Jan 2021 00:37:08 GMT
content-encoding
br
last-modified
Thu, 05 Nov 2020 11:52:29 GMT
age
1182
etag
W/"33b-5b35abafefa9a-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
503217105 507191935, 502267779 503311840
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
application/javascript
vpE4IgkWTromHGP-jack-improve-86,175986_artikel_100.jpg
images.tvtoday.de/files/images/297608/1/
68 B
278 B
Image
General
Full URL
https://images.tvtoday.de/files/images/297608/1/vpE4IgkWTromHGP-jack-improve-86,175986_artikel_100.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
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
Tue, 12 Jan 2021 00:56:50 GMT
last-modified
Tue, 12 Jan 2021 00:56:50 GMT
age
0
x-varnish
502267780
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
Tue, 12 Jan 2021 00:45:42 GMT
content-encoding
br
last-modified
Mon, 06 Jul 2020 08:53:23 GMT
age
667
etag
W/"71134-5a9c201d835a5-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
498292734 503313072, 502267782 503313138
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
application/javascript
vpE4IgkWTromHGPpr3sdVITWKCbr0PD30lOGVu9Q5JsqmBFLrbTuDHyK3nwo7T7zc8c.png
uobsoe.com/img/promotools/
68 B
242 B
Image
General
Full URL
https://uobsoe.com/img/promotools/vpE4IgkWTromHGPpr3sdVITWKCbr0PD30lOGVu9Q5JsqmBFLrbTuDHyK3nwo7T7zc8c.png
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.25.11 , 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
Tue, 12 Jan 2021 00:56:50 GMT
Cache-Control
no-cache, private
Server
nginx
Connection
keep-alive
Content-Length
68
Content-Type
image/png
index.html
cmp.tvtoday.de/ Frame C825
4 KB
2 KB
Document
General
Full URL
https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&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.7.35 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
73acb88154558109a568cb65e76ae54cc7cd7e8e1174db5aca1bcc333659e2c5

Request headers

:method
GET
:authority
cmp.tvtoday.de
:scheme
https
:path
/index.html?message_id=391552&consentUUID=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&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=00138eb47253bf4865ffcf3d1:1638320209800:1610413009800:.tvtoday.de:2:tvspielf:D/T/R/H/W/-/-/Thema_Entertainment_tvtoday:noevent:1610413009800:oyo99r; _ga=GA1.2.1514907126.1610413010; _gid=GA1.2.1790450104.1610413010; _gat=1; consentUUID=3353fcc2-1375-4cee-969f-458a87c9c5f0; iom_consent=01000000000000&1610413010299
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, 10 Dec 2020 20:54:21 GMT
server
AmazonS3
content-encoding
gzip
date
Tue, 12 Jan 2021 00:12:15 GMT
etag
"4cf46ff8c4b263b235bc41f26e639ed8"
vary
Accept-Encoding
x-cache
Hit from cloudfront
via
1.1 2fc0d20914c32e5cd76477ed042298d1.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C1
x-amz-cf-id
XJaz3bvF18FicokEwEZueeQVNOd6sliY8yoyVvJjdnLXoYLwfSLe5Q==
age
2676
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
703 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.217.10.246 Ashburn, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

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
Tue, 12 Jan 2021 00:56:51 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
4DEF6FBC9877C3F2
Content-Length
53
x-amz-id-2
pk/jtvgFz/544L/8M3feC7mczU/TCE6c/xj4P/1mEDsLlskmI5bsgYPTBsS199PXE/VQFHxuQMQ=
Last-Modified
Sun, 10 Jan 2021 10:24:04 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
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
0
homad_clienConfig.json
www.tvtoday.de/js/
291 B
392 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
Tue, 12 Jan 2021 00:55:25 GMT
content-encoding
br
last-modified
Mon, 01 Apr 2019 12:21:25 GMT
age
83
etag
W/"123-585770f266684-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
505314201 494495900, 503798372 505275399
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
application/json
547f0c02e4b089153cb74c69_780.jpg
images.tvtoday.de/itv/2021-01-12/
17 KB
18 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-12/547f0c02e4b089153cb74c69_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
00a35d8d7162283661105afcdda43eefc2beeb363d4b064f7ff137db60e5e14c
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
Tue, 12 Jan 2021 00:42:49 GMT
last-modified
Thu, 07 Jan 2021 03:21:38 GMT
age
840
etag
"4523-5b846f00d3a20"
vary
x-requested-with
x-varnish
503798373 507555426
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
harry-potter-wichtiges-detail-ueber-harry,230086_tm_100.jpg
images.tvtoday.de/files/images/202101/1/
13 KB
13 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/202101/1/harry-potter-wichtiges-detail-ueber-harry,230086_tm_100.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
ad502bba170342001e220db5b6cd7361091beb3535b02ff5537120689b0e9f72
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
Tue, 12 Jan 2021 00:06:51 GMT
last-modified
Sun, 10 Jan 2021 09:00:44 GMT
age
2998
etag
"3257-5b88806523933"
vary
x-requested-with
x-varnish
511395119 510701796
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
daisy-ridley-in-star-wars-9-der-aufstieg-skywalkers,230079_tm_100.jpg
images.tvtoday.de/files/images/202101/1/
11 KB
11 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/202101/1/daisy-ridley-in-star-wars-9-der-aufstieg-skywalkers,230079_tm_100.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
ef30642a57b003936aaefedeee1b027e042e7404c26f089d3a6a56fcdf4dd8c8
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
Tue, 12 Jan 2021 00:13:47 GMT
last-modified
Sun, 10 Jan 2021 06:02:16 GMT
age
2583
etag
"2a72-5b885881197e2"
vary
x-requested-with
x-varnish
507254501 501448305
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
daniel-meyer,230073_tm_100.jpg
images.tvtoday.de/files/images/202101/1/
9 KB
9 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/202101/1/daniel-meyer,230073_tm_100.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
a44e9baa23235ac3254bee32824a709a3b7e32f95049234d7f69e682b9c664a6
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
Tue, 12 Jan 2021 00:13:29 GMT
last-modified
Sat, 09 Jan 2021 10:00:48 GMT
age
2601
etag
"22a1-5b874bf4bd276"
vary
x-requested-with
x-varnish
503008295 510736295
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
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
Tue, 12 Jan 2021 00:32:42 GMT
content-encoding
br
last-modified
Thu, 20 Dec 2018 07:17:40 GMT
age
1447
etag
W/"194-57d6eed0ecd72-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
512657683 507901430, 503008296 475888163
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
application/javascript
config.json
hgc-cf-cache-1.svonm.com/www.tvtoday.de/
234 B
1005 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
Tue, 12 Jan 2021 00:56:50 GMT
Via
1.1 ee6ddabcc69c6aa1c28ad24a4a8f86b2.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA50-C1
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
Accept-Ranges
bytes
X-Amz-Cf-Id
8WoQc0JU_dt057R-jBd2jVOmxGKFI8sxg8itVzD5BV1rTFBdIz9ZuQ==
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Notice.7f9f7.css
cmp.tvtoday.de/ Frame C825
27 KB
5 KB
Stylesheet
General
Full URL
https://cmp.tvtoday.de/Notice.7f9f7.css
Requested by
Host: cmp.tvtoday.de
URL: https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&preload_message=true&consentLanguage=de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
65.9.7.35 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
0ae5db3739ab7117213fc81312987373f78ea0b7006e644b2fa00b99ca04c0ad

Request headers

Referer
https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&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
Tue, 12 Jan 2021 00:09:28 GMT
content-encoding
gzip
last-modified
Thu, 10 Dec 2020 20:54:21 GMT
server
AmazonS3
age
2843
etag
W/"3394c9d864848c4034878955cbc138ca"
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
text/css
via
1.1 2fc0d20914c32e5cd76477ed042298d1.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C1
x-amz-cf-id
u2UzxIWKoLl8C59j5cUKYBbIphqjzv81vOvRhPc0o8P7WaZ2OVcw3w==
polyfills.ede70.js
cmp.tvtoday.de/ Frame C825
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=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&preload_message=true&consentLanguage=de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
65.9.7.35 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
feffa10be7222692f7cf76470564dbe7c0a3d76d5f4da8c12006b879f1cd21ec

Request headers

Referer
https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&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
Mon, 11 Jan 2021 23:58:50 GMT
content-encoding
gzip
last-modified
Thu, 10 Dec 2020 20:54:21 GMT
server
AmazonS3
age
3481
etag
"3b8e7686c01cb06333d0575ac700a9a0"
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
via
1.1 2fc0d20914c32e5cd76477ed042298d1.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C1
x-amz-cf-id
3cK0joxFAxf_twZe6FvPg9zBCGvDC3Q6_DgrhUJK_ZHcwKcCvwf2Bw==
Notice.c3b1a.js
cmp.tvtoday.de/ Frame C825
160 KB
40 KB
Script
General
Full URL
https://cmp.tvtoday.de/Notice.c3b1a.js
Requested by
Host: cmp.tvtoday.de
URL: https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&preload_message=true&consentLanguage=de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
65.9.7.35 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
2b4bc61ab37d7386d97ca8418168601c9f9e6f44fcddb47fe97ebf29bfdbc01b

Request headers

Referer
https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&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
Tue, 12 Jan 2021 00:40:54 GMT
content-encoding
gzip
last-modified
Thu, 10 Dec 2020 20:54:21 GMT
server
AmazonS3
age
958
etag
W/"8eb523760fb6647a412b860f42f0915d"
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
via
1.1 2fc0d20914c32e5cd76477ed042298d1.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C1
x-amz-cf-id
AxGbtC48R8Tk7wtSYq7lEOnNgQ77SjoDhskLpEH8IaPlxD3DBJOhCQ==
/
ssl.3.damoh.tvtoday.de/04162bfd2bcaffc37e213df8df6197ba4a529801/
247 KB
76 KB
XHR
General
Full URL
https://ssl.3.damoh.tvtoday.de/04162bfd2bcaffc37e213df8df6197ba4a529801/
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.89.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.206.89.251.148.clients.your-server.de
Software
AmazonS3 /
Resource Hash
6d807e5aeaf5425dc80cd13a5e26190a4388a2f3592dbc78eaae149ff3448bd7

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
Tue, 12 Jan 2021 00:56:50 GMT
Content-Encoding
gzip
Connection
keep-alive
Content-Length
76775
Last-Modified
Mon, 11 Jan 2021 10:18:18 GMT
Server
AmazonS3
Etag
W/"483ff3550b8214269c33a86858be899e"
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
de21-homad-4
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
/
d2p3zdq8vjvnxd.cloudfront.net/ Frame C825
26 B
367 B
Image
General
Full URL
https://d2p3zdq8vjvnxd.cloudfront.net/?s_id=4176&m_id=391552&consentUUID=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2600:9000:2190: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=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&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
Tue, 12 Jan 2021 00:56:51 GMT
via
1.1 9349ae4f82564896b96f5303b030d189.cloudfront.net (CloudFront)
last-modified
Wed, 10 Apr 2019 18:39:37 GMT
server
AmazonS3
x-amz-cf-pop
ZRH50-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
3QYqxy70HIU6ZInTfdCo5h9D8VrNUd_oyezMtQkaGDkwJJR4K8jP8Q==
noun_Security_2839859.png
p5.focus.de/fol/multimedia/consentlayer/ Frame C825
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:bb28 , 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=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&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
Tue, 12 Jan 2021 00:56:50 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
Wed, 12 Jan 2022 00:56:39 GMT
truncated
/
247 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
6d807e5aeaf5425dc80cd13a5e26190a4388a2f3592dbc78eaae149ff3448bd7

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/
53 B
703 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=1134019822
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.217.10.246 Ashburn, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

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
Tue, 12 Jan 2021 00:56:52 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
E778A5D257B28E77
Content-Length
53
x-amz-id-2
l0bX0qXoSzNnkAbjQfH6YgbyZysLefMzyRk7ipMTmSF+h7OnbPYzcPisdJPzz2+KKYNVFU4aXxQ=
Last-Modified
Sun, 10 Jan 2021 10:24:04 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
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
0
homad_clienConfig.json
www.tvtoday.de/js/
291 B
391 B
XHR
General
Full URL
https://www.tvtoday.de/js/homad_clienConfig.json?cache=6102815868
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
Tue, 12 Jan 2021 00:55:29 GMT
content-encoding
br
last-modified
Mon, 01 Apr 2019 12:21:25 GMT
age
80
etag
W/"123-585770f266684-gzip"
vary
x-requested-with,Accept-Encoding
x-varnish
506656116 506655970, 511295500 511445121
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=5692347467
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
Tue, 12 Jan 2021 00:56:50 GMT
Via
1.1 ee6ddabcc69c6aa1c28ad24a4a8f86b2.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
57
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
jF8jkHGd9CnQ9AeohXw2v5mawOmj187tuzwJpHBCVfw4oBlNe-qhkQ==
Expires
Thu, 01 Jan 1970 00:00:00 GMT
/
ssl.3.damoh.tvtoday.de/70bd0fca87b0279aa577446acdaad79e1f02d95c/
234 B
1 KB
XHR
General
Full URL
https://ssl.3.damoh.tvtoday.de/70bd0fca87b0279aa577446acdaad79e1f02d95c/
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.89.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.206.89.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
Tue, 12 Jan 2021 00:56:51 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
de21-homad-4
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/T2JqZWN0LmNyZWF0ZTpmdW5jdGlvbihrKXtmdW5jdGlvbiBuKCl7fW4ucHJvdG90eXBlPWs7cmV0dXJuIG5ldyBufSxRYjtpZigiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LnNldFByb3RvdHlwZU9mKVFiPU9iamVjdC5zZXRQcm90b3R5cGVPZjtlbHNle3ZhciBSYjthOnt2YXIgU2I9e1RkOiEwfSxUYj17fTt0cnl7VGIuX19wcm90b19fPVNiO1JiPVRiLlRkO2JyZWFrIGF9Y2F0Y2goayl7fVJiPSExfVFiPVJiP2Z1bmN0aW9uKGssbil7ay5fX3Byb3RvX189bjtpZihrLl9fcHJvdG9fXyE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcihrKyIgaXMgbm90IGV4dGVuc2libGUiKTtyZXR1cm4ga306bnVsbH0KdmFyIFViPVFiO2Z1bmN0aW9uIHkoayxuKXtrLnByb3RvdHlwZT1QYihuLnByb3RvdHlwZSk7ay5wcm90b3R5cGUuY29uc3RydWN0b3I9aztpZihVYilVYihrLG4pO2Vsc2UgZm9yKHZhciB4IGluIG4paWYoInByb3RvdHlwZSIhPXgpaWYoT2JqZWN0LmRlZmluZVByb3BlcnRpZXMpe3ZhciBHPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix4KTtHJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoayx4LEcpfWVsc2Uga1t4XT1uW3hdfWZ1bmN0aW9uIG1jKGssbil7aWYobil7dmFyIHg9UWE7az1rLnNwbGl0KCIuIik7Zm9yKHZhciBHPTA7RzxrLmxlbmd0aC0xO0crKyl7dmFyIEs9a1tHXTtLIGluIHh8fCh4W0tdPXt9KTt4PXhbS119az1rW2subGVuZ3RoLTFdO0c9eFtrXTtuPW4oRyk7biE9RyYmbnVsbCE9biYmaGEoeCxrLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pfX0KbWMoIlByb21pc2UiLGZ1bmN0aW9uKGspe2Z1bmN0aW9uIG4odCl7dGhpcy5iPTA7dGhpcy5jPXZvaWQgMDt0aGlzLmE9W107dmFyIHE9dGhpcy5nKCk7dHJ5e3QocS5yZXNvbHZlLHEucmVqZWN0KX1jYXRjaChyKXtxLnJlamVjdChyKX19ZnVuY3Rpb24geCgpe3RoaXMuYT1udWxsfWZ1bmN0aW9uIEcodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBuP3Q6bmV3IG4oZnVuY3Rpb24ocSl7cSh0KX0pfWlmKGspcmV0dXJuIGs7eC5wcm90b3R5cGUuYj1mdW5jdGlvbih0KXtpZihudWxsPT10aGlzLmEpe3RoaXMuYT1bXTt2YXIgcT10aGlzO3RoaXMuZyhmdW5jdGlvbigpe3EuYygpfSl9dGhpcy5hLnB1c2godCl9O3ZhciBLPVFhLnNldFRpbWVvdXQ7eC5wcm90b3R5cGUuZz1mdW5jdGlvbih0KXtLKHQsMCl9O3gucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXtmb3IoO3RoaXMuYSYmdGhpcy5hLmxlbmd0aDspe3ZhciB0PXRoaXMuYTt0aGlzLmE9W107Zm9yKHZhciBxPTA7cTx0Lmxlbmd0aDsrK3Epe3ZhciByPQp0W3FdO3RbcV09bnVsbDt0cnl7cigpfWNhdGNoKHcpe3RoaXMuaSh3KX19fXRoaXMuYT1udWxsfTt4LnByb3RvdHlwZS5pPWZ1bmN0aW9uKHQpe3RoaXMuZyhmdW5jdGlvbigpe3Rocm93IHQ7fSl9O24ucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHcpe3JldHVybiBmdW5jdGlvbihJKXtyfHwocj0hMCx3LmNhbGwocSxJKSl9fXZhciBxPXRoaXMscj0hMTtyZXR1cm57cmVzb2x2ZTp0KHRoaXMuRikscmVqZWN0OnQodGhpcy5pKX19O24ucHJvdG90eXBlLkY9ZnVuY3Rpb24odCl7aWYodD09PXRoaXMpdGhpcy5pKG5ldyBUeXBlRXJyb3IoIkEgUHJvbWlzZSBjYW5ub3QgcmVzb2x2ZSB0byBpdHNlbGYiKSk7ZWxzZSBpZih0IGluc3RhbmNlb2Ygbil0aGlzLkEodCk7ZWxzZXthOnN3aXRjaCh0eXBlb2YgdCl7Y2FzZSAib2JqZWN0Ijp2YXIgcT1udWxsIT10O2JyZWFrIGE7Y2FzZSAiZnVuY3Rpb24iOnE9ITA7YnJlYWsgYTtkZWZhdWx0OnE9ITF9cT90aGlzLm8odCk6dGhpcy5mKHQpfX07Cm4ucHJvdG90eXBlLm89ZnVuY3Rpb24odCl7dmFyIHE9dm9pZCAwO3RyeXtxPXQudGhlbn1jYXRjaChyKXt0aGlzLmkocik7cmV0dXJufSJmdW5jdGlvbiI9PXR5cGVvZiBxP3RoaXMucyhxLHQpOnRoaXMuZih0KX07bi5wcm90b3R5cGUuaT1mdW5jdGlvbih0KXt0aGlzLmwoMix0KX07bi5wcm90b3R5cGUuZj1mdW5jdGlvbih0KXt0aGlzLmwoMSx0KX07bi5wcm90b3R5cGUubD1mdW5jdGlvbih0LHEpe2lmKDAhPXRoaXMuYil0aHJvdyBFcnJvcigiQ2Fubm90IHNldHRsZSgiK3QrIiwgIitxKyIpOiBQcm9taXNlIGFscmVhZHkgc2V0dGxlZCBpbiBzdGF0ZSIrdGhpcy5iKTt0aGlzLmI9dDt0aGlzLmM9cTt0aGlzLm0oKX07bi5wcm90b3R5cGUubT1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuYSl7Zm9yKHZhciB0PTA7dDx0aGlzLmEubGVuZ3RoOysrdClRLmIodGhpcy5hW3RdKTt0aGlzLmE9bnVsbH19O3ZhciBRPW5ldyB4O24ucHJvdG90eXBlLkE9ZnVuY3Rpb24odCl7dmFyIHE9dGhpcy5nKCk7CnQucmMocS5yZXNvbHZlLHEucmVqZWN0KX07bi5wcm90b3R5cGUucz1mdW5jdGlvbih0LHEpe3ZhciByPXRoaXMuZygpO3RyeXt0LmNhbGwocSxyLnJlc29sdmUsci5yZWplY3QpfWNhdGNoKHcpe3IucmVqZWN0KHcpfX07bi5wcm90b3R5cGUudGhlbj1mdW5jdGlvbih0LHEpe2Z1bmN0aW9uIHIoVSxHYSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIFU/ZnVuY3Rpb24ocmEpe3RyeXt3KFUocmEpKX1jYXRjaChzYSl7SShzYSl9fTpHYX12YXIgdyxJLGJhPW5ldyBuKGZ1bmN0aW9uKFUsR2Epe3c9VTtJPUdhfSk7dGhpcy5yYyhyKHQsdykscihxLEkpKTtyZXR1cm4gYmF9O24ucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLHQpfTtuLnByb3RvdHlwZS5yYz1mdW5jdGlvbih0LHEpe2Z1bmN0aW9uIHIoKXtzd2l0Y2gody5iKXtjYXNlIDE6dCh3LmMpO2JyZWFrO2Nhc2UgMjpxKHcuYyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBzdGF0ZTogIisKdy5iKTt9fXZhciB3PXRoaXM7bnVsbD09dGhpcy5hP1EuYihyKTp0aGlzLmEucHVzaChyKX07bi5yZXNvbHZlPUc7bi5yZWplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKGZ1bmN0aW9uKHEscil7cih0KX0pfTtuLnJhY2U9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKGZ1bmN0aW9uKHEscil7Zm9yKHZhciB3PUViKHQpLEk9dy5uZXh0KCk7IUkuZG9uZTtJPXcubmV4dCgpKUcoSS52YWx1ZSkucmMocSxyKX0pfTtuLmFsbD1mdW5jdGlvbih0KXt2YXIgcT1FYih0KSxyPXEubmV4dCgpO3JldHVybiByLmRvbmU/RyhbXSk6bmV3IG4oZnVuY3Rpb24odyxJKXtmdW5jdGlvbiBiYShyYSl7cmV0dXJuIGZ1bmN0aW9uKHNhKXtVW3JhXT1zYTtHYS0tOzA9PUdhJiZ3KFUpfX12YXIgVT1bXSxHYT0wO2RvIFUucHVzaCh2b2lkIDApLEdhKyssRyhyLnZhbHVlKS5yYyhiYShVLmxlbmd0aC0xKSxJKSxyPXEubmV4dCgpO3doaWxlKCFyLmRvbmUpfSl9O3JldHVybiBufSk7CmZ1bmN0aW9uIG5jKCl7dGhpcy5jPSExO3RoaXMuZz1udWxsO3RoaXMuYj12b2lkIDA7dGhpcy5hPTE7dGhpcy5sPTA7dGhpcy5pPW51bGx9ZnVuY3Rpb24gb2Moayl7aWYoay5jKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtrLmM9ITB9bmMucHJvdG90eXBlLmY9ZnVuY3Rpb24oayl7dGhpcy5iPWt9O2Z1bmN0aW9uIHBjKGssbil7ay5pPXtZZDpuLGdlOiEwfTtrLmE9ay5sfW5jLnByb3RvdHlwZS5yZXR1cm49ZnVuY3Rpb24oayl7dGhpcy5pPXtyZXR1cm46a307dGhpcy5hPXRoaXMubH07ZnVuY3Rpb24gcWMoayxuLHgpe2suYT14O3JldHVybnt2YWx1ZTpufX1mdW5jdGlvbiB6YyhrKXt0aGlzLmE9bmV3IG5jO3RoaXMuYj1rfQpmdW5jdGlvbiBBYyhrLG4pe29jKGsuYSk7dmFyIHg9ay5hLmc7aWYoeClyZXR1cm4gQmMoaywicmV0dXJuImluIHg/eFsicmV0dXJuIl06ZnVuY3Rpb24oRyl7cmV0dXJue3ZhbHVlOkcsZG9uZTohMH19LG4say5hLnJldHVybik7ay5hLnJldHVybihuKTtyZXR1cm4gQ2Moayl9ZnVuY3Rpb24gQmMoayxuLHgsRyl7dHJ5e3ZhciBLPW4uY2FsbChrLmEuZyx4KTtpZighKEsgaW5zdGFuY2VvZiBPYmplY3QpKXRocm93IG5ldyBUeXBlRXJyb3IoIkl0ZXJhdG9yIHJlc3VsdCAiK0srIiBpcyBub3QgYW4gb2JqZWN0Iik7aWYoIUsuZG9uZSlyZXR1cm4gay5hLmM9ITEsSzt2YXIgUT1LLnZhbHVlfWNhdGNoKHQpe3JldHVybiBrLmEuZz1udWxsLHBjKGsuYSx0KSxDYyhrKX1rLmEuZz1udWxsO0cuY2FsbChrLmEsUSk7cmV0dXJuIENjKGspfQpmdW5jdGlvbiBDYyhrKXtmb3IoO2suYS5hOyl0cnl7dmFyIG49ay5iKGsuYSk7aWYobilyZXR1cm4gay5hLmM9ITEse3ZhbHVlOm4udmFsdWUsZG9uZTohMX19Y2F0Y2goeCl7ay5hLmI9dm9pZCAwLHBjKGsuYSx4KX1rLmEuYz0hMTtpZihrLmEuaSl7bj1rLmEuaTtrLmEuaT1udWxsO2lmKG4uZ2UpdGhyb3cgbi5ZZDtyZXR1cm57dmFsdWU6bi5yZXR1cm4sZG9uZTohMH19cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX0KZnVuY3Rpb24gRGMoayl7dGhpcy5uZXh0PWZ1bmN0aW9uKG4pe29jKGsuYSk7ay5hLmc/bj1CYyhrLGsuYS5nLm5leHQsbixrLmEuZik6KGsuYS5mKG4pLG49Q2MoaykpO3JldHVybiBufTt0aGlzLnRocm93PWZ1bmN0aW9uKG4pe29jKGsuYSk7ay5hLmc/bj1CYyhrLGsuYS5nWyJ0aHJvdyJdLG4say5hLmYpOihwYyhrLmEsbiksbj1DYyhrKSk7cmV0dXJuIG59O3RoaXMucmV0dXJuPWZ1bmN0aW9uKG4pe3JldHVybiBBYyhrLG4pfTt1YigpO3RoaXNbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfX1mdW5jdGlvbiBFYyhrKXtmdW5jdGlvbiBuKEcpe3JldHVybiBrLm5leHQoRyl9ZnVuY3Rpb24geChHKXtyZXR1cm4gay50aHJvdyhHKX1yZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oRyxLKXtmdW5jdGlvbiBRKHQpe3QuZG9uZT9HKHQudmFsdWUpOlByb21pc2UucmVzb2x2ZSh0LnZhbHVlKS50aGVuKG4seCkudGhlbihRLEspfVEoay5uZXh0KCkpfSl9CmZ1bmN0aW9uIEZjKGspe3JldHVybiBFYyhuZXcgRGMobmV3IHpjKGspKSl9ZnVuY3Rpb24gR2MoayxuKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGssbil9Cm1jKCJXZWFrTWFwIixmdW5jdGlvbihrKXtmdW5jdGlvbiBuKHIpe3RoaXMuYT0ocSs9TWF0aC5yYW5kb20oKSsxKS50b1N0cmluZygpO2lmKHIpe3I9RWIocik7Zm9yKHZhciB3OyEodz1yLm5leHQoKSkuZG9uZTspdz13LnZhbHVlLHRoaXMuc2V0KHdbMF0sd1sxXSl9fWZ1bmN0aW9uIHgoKXt9ZnVuY3Rpb24gRyhyKXt2YXIgdz10eXBlb2YgcjtyZXR1cm4ib2JqZWN0Ij09PXcmJm51bGwhPT1yfHwiZnVuY3Rpb24iPT09d31mdW5jdGlvbiBLKHIpe2lmKCFHYyhyLHQpKXt2YXIgdz1uZXcgeDtoYShyLHQse3ZhbHVlOnd9KX19ZnVuY3Rpb24gUShyKXt2YXIgdz1PYmplY3Rbcl07dyYmKE9iamVjdFtyXT1mdW5jdGlvbihJKXtpZihJIGluc3RhbmNlb2YgeClyZXR1cm4gSTtLKEkpO3JldHVybiB3KEkpfSl9aWYoZnVuY3Rpb24oKXtpZigha3x8IU9iamVjdC5zZWFsKXJldHVybiExO3RyeXt2YXIgcj1PYmplY3Quc2VhbCh7fSksdz1PYmplY3Quc2VhbCh7fSksST1uZXcgayhbW3IsMl0sClt3LDNdXSk7aWYoMiE9SS5nZXQocil8fDMhPUkuZ2V0KHcpKXJldHVybiExO0kuZGVsZXRlKHIpO0kuc2V0KHcsNCk7cmV0dXJuIUkuaGFzKHIpJiY0PT1JLmdldCh3KX1jYXRjaChiYSl7cmV0dXJuITF9fSgpKXJldHVybiBrO3ZhciB0PSIkanNjb21wX2hpZGRlbl8iK01hdGgucmFuZG9tKCk7USgiZnJlZXplIik7USgicHJldmVudEV4dGVuc2lvbnMiKTtRKCJzZWFsIik7dmFyIHE9MDtuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24ocix3KXtpZighRyhyKSl0aHJvdyBFcnJvcigiSW52YWxpZCBXZWFrTWFwIGtleSIpO0socik7aWYoIUdjKHIsdCkpdGhyb3cgRXJyb3IoIldlYWtNYXAga2V5IGZhaWw6ICIrcik7clt0XVt0aGlzLmFdPXc7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLmdldD1mdW5jdGlvbihyKXtyZXR1cm4gRyhyKSYmR2Mocix0KT9yW3RdW3RoaXMuYV06dm9pZCAwfTtuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24ocil7cmV0dXJuIEcocikmJkdjKHIsdCkmJkdjKHJbdF0sCnRoaXMuYSl9O24ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihyKXtyZXR1cm4gRyhyKSYmR2Mocix0KSYmR2Moclt0XSx0aGlzLmEpP2RlbGV0ZSByW3RdW3RoaXMuYV06ITF9O3JldHVybiBufSk7Cm1jKCJNYXAiLGZ1bmN0aW9uKGspe2Z1bmN0aW9uIG4oKXt2YXIgcT17fTtyZXR1cm4gcS5ZYT1xLm5leHQ9cS5oZWFkPXF9ZnVuY3Rpb24geChxLHIpe3ZhciB3PXEuYTtyZXR1cm4gdmIoZnVuY3Rpb24oKXtpZih3KXtmb3IoO3cuaGVhZCE9cS5hOyl3PXcuWWE7Zm9yKDt3Lm5leHQhPXcuaGVhZDspcmV0dXJuIHc9dy5uZXh0LHtkb25lOiExLHZhbHVlOnIodyl9O3c9bnVsbH1yZXR1cm57ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fSl9ZnVuY3Rpb24gRyhxLHIpe3ZhciB3PXImJnR5cGVvZiByOyJvYmplY3QiPT13fHwiZnVuY3Rpb24iPT13P1EuaGFzKHIpP3c9US5nZXQocik6KHc9IiIrICsrdCxRLnNldChyLHcpKTp3PSJwXyIrcjt2YXIgST1xLmJbd107aWYoSSYmR2MocS5iLHcpKWZvcihxPTA7cTxJLmxlbmd0aDtxKyspe3ZhciBiYT1JW3FdO2lmKHIhPT1yJiZiYS5rZXkhPT1iYS5rZXl8fHI9PT1iYS5rZXkpcmV0dXJue2lkOncsbGlzdDpJLGluZGV4OnEsdWE6YmF9fXJldHVybntpZDp3LApsaXN0OkksaW5kZXg6LTEsdWE6dm9pZCAwfX1mdW5jdGlvbiBLKHEpe3RoaXMuYj17fTt0aGlzLmE9bigpO3RoaXMuc2l6ZT0wO2lmKHEpe3E9RWIocSk7Zm9yKHZhciByOyEocj1xLm5leHQoKSkuZG9uZTspcj1yLnZhbHVlLHRoaXMuc2V0KHJbMF0sclsxXSl9fWlmKGZ1bmN0aW9uKCl7aWYoIWt8fCJmdW5jdGlvbiIhPXR5cGVvZiBrfHwhay5wcm90b3R5cGUuZW50cmllc3x8ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5zZWFsKXJldHVybiExO3RyeXt2YXIgcT1PYmplY3Quc2VhbCh7eDo0fSkscj1uZXcgayhFYihbW3EsInMiXV0pKTtpZigicyIhPXIuZ2V0KHEpfHwxIT1yLnNpemV8fHIuZ2V0KHt4OjR9KXx8ci5zZXQoe3g6NH0sInQiKSE9cnx8MiE9ci5zaXplKXJldHVybiExO3ZhciB3PXIuZW50cmllcygpLEk9dy5uZXh0KCk7aWYoSS5kb25lfHxJLnZhbHVlWzBdIT1xfHwicyIhPUkudmFsdWVbMV0pcmV0dXJuITE7ST13Lm5leHQoKTtyZXR1cm4gSS5kb25lfHw0IT1JLnZhbHVlWzBdLnh8fAoidCIhPUkudmFsdWVbMV18fCF3Lm5leHQoKS5kb25lPyExOiEwfWNhdGNoKGJhKXtyZXR1cm4hMX19KCkpcmV0dXJuIGs7dWIoKTt2YXIgUT1uZXcgV2Vha01hcDtLLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24ocSxyKXtxPTA9PT1xPzA6cTt2YXIgdz1HKHRoaXMscSk7dy5saXN0fHwody5saXN0PXRoaXMuYlt3LmlkXT1bXSk7dy51YT93LnVhLnZhbHVlPXI6KHcudWE9e25leHQ6dGhpcy5hLFlhOnRoaXMuYS5ZYSxoZWFkOnRoaXMuYSxrZXk6cSx2YWx1ZTpyfSx3Lmxpc3QucHVzaCh3LnVhKSx0aGlzLmEuWWEubmV4dD13LnVhLHRoaXMuYS5ZYT13LnVhLHRoaXMuc2l6ZSsrKTtyZXR1cm4gdGhpc307Sy5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHEpe3E9Ryh0aGlzLHEpO3JldHVybiBxLnVhJiZxLmxpc3Q/KHEubGlzdC5zcGxpY2UocS5pbmRleCwxKSxxLmxpc3QubGVuZ3RofHxkZWxldGUgdGhpcy5iW3EuaWRdLHEudWEuWWEubmV4dD1xLnVhLm5leHQscS51YS5uZXh0LllhPXEudWEuWWEsCnEudWEuaGVhZD1udWxsLHRoaXMuc2l6ZS0tLCEwKTohMX07Sy5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmI9e307dGhpcy5hPXRoaXMuYS5ZYT1uKCk7dGhpcy5zaXplPTB9O0sucHJvdG90eXBlLmhhcz1mdW5jdGlvbihxKXtyZXR1cm4hIUcodGhpcyxxKS51YX07Sy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHEpe3JldHVybihxPUcodGhpcyxxKS51YSkmJnEudmFsdWV9O0sucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4geCh0aGlzLGZ1bmN0aW9uKHEpe3JldHVybltxLmtleSxxLnZhbHVlXX0pfTtLLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHgodGhpcyxmdW5jdGlvbihxKXtyZXR1cm4gcS5rZXl9KX07Sy5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHgodGhpcyxmdW5jdGlvbihxKXtyZXR1cm4gcS52YWx1ZX0pfTtLLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHEscil7Zm9yKHZhciB3PXRoaXMuZW50cmllcygpLApJOyEoST13Lm5leHQoKSkuZG9uZTspST1JLnZhbHVlLHEuY2FsbChyLElbMV0sSVswXSx0aGlzKX07Sy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1LLnByb3RvdHlwZS5lbnRyaWVzO3ZhciB0PTA7cmV0dXJuIEt9KTt2YXIgSGM9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbjpmdW5jdGlvbihrLG4pe2Zvcih2YXIgeD0xO3g8YXJndW1lbnRzLmxlbmd0aDt4Kyspe3ZhciBHPWFyZ3VtZW50c1t4XTtpZihHKWZvcih2YXIgSyBpbiBHKUdjKEcsSykmJihrW0tdPUdbS10pfXJldHVybiBrfTttYygiT2JqZWN0LmFzc2lnbiIsZnVuY3Rpb24oayl7cmV0dXJuIGt8fEhjfSk7Cm1jKCJBcnJheS5mcm9tIixmdW5jdGlvbihrKXtyZXR1cm4gaz9rOmZ1bmN0aW9uKG4seCxHKXt4PW51bGwhPXg/eDpmdW5jdGlvbihxKXtyZXR1cm4gcX07dmFyIEs9W10sUT0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZuW1N5bWJvbC5pdGVyYXRvcl07aWYoImZ1bmN0aW9uIj09dHlwZW9mIFEpe249US5jYWxsKG4pO2Zvcih2YXIgdD0wOyEoUT1uLm5leHQoKSkuZG9uZTspSy5wdXNoKHguY2FsbChHLFEudmFsdWUsdCsrKSl9ZWxzZSBmb3IoUT1uLmxlbmd0aCx0PTA7dDxRO3QrKylLLnB1c2goeC5jYWxsKEcsblt0XSx0KSk7cmV0dXJuIEt9fSk7bWMoIk9iamVjdC5pcyIsZnVuY3Rpb24oayl7cmV0dXJuIGs/azpmdW5jdGlvbihuLHgpe3JldHVybiBuPT09eD8wIT09bnx8MS9uPT09MS94Om4hPT1uJiZ4IT09eH19KTsKbWMoIkFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyIsZnVuY3Rpb24oayl7cmV0dXJuIGs/azpmdW5jdGlvbihuLHgpe3ZhciBHPXRoaXM7RyBpbnN0YW5jZW9mIFN0cmluZyYmKEc9U3RyaW5nKEcpKTt2YXIgSz1HLmxlbmd0aDt4PXh8fDA7Zm9yKDA+eCYmKHg9TWF0aC5tYXgoeCtLLDApKTt4PEs7eCsrKXt2YXIgUT1HW3hdO2lmKFE9PT1ufHxPYmplY3QuaXMoUSxuKSlyZXR1cm4hMH1yZXR1cm4hMX19KTsKbWMoIlN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMiLGZ1bmN0aW9uKGspe3JldHVybiBrP2s6ZnVuY3Rpb24obix4KXtpZihudWxsPT10aGlzKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSAndGhpcycgdmFsdWUgZm9yIFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgbXVzdCBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQiKTtpZihuIGluc3RhbmNlb2YgUmVnRXhwKXRocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IHRvIFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgbXVzdCBub3QgYmUgYSByZWd1bGFyIGV4cHJlc3Npb24iKTtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZihuLHh8fDApfX0pOwooZnVuY3Rpb24oKXtmdW5jdGlvbiBrKCl7dGhpcy5vPXRoaXMuZz10aGlzLmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmY9MDt0aGlzLmM9IiI7dGhpcy5sPSExfWZ1bmN0aW9uIG4oYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIHgoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5zPSExO3JldHVybiBhfWZ1bmN0aW9uIEcoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIEsoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIFEoYSxjKXtyZXR1cm4gRS5jYWxsKHRoaXMsYSxjKXx8dGhpc31mdW5jdGlvbiB0KGEpe3JldHVybiBBLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBxKGEpe3JldHVybiBGLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiByKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuYWE9ITE7YS5JPTEwO2EuSz0hMTthLklhPSExO2EuTz0hMTthLlA9ITE7YS5zPTA7YS51PSExOwphLlc9bC5zKDEwKTthLlg9ITE7YS5jPSExO2EuWj0hMTtyZXR1cm4gYX1mdW5jdGlvbiB3KGEpe3JldHVybiBBLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBJKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5sPS0xO3JldHVybiBhfWZ1bmN0aW9uIGJhKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuWD0hMTthLm89ITE7YS5pc1BsYXlpbmc9ITE7YS5mPTA7YS5zPSExO3JldHVybiBhfWZ1bmN0aW9uIFUoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmY9ITE7YS5sPTA7YS51PTA7YS5kdXJhdGlvbj0wO2EubT0hMTtyZXR1cm4gYX1mdW5jdGlvbiBHYShhKXtyZXR1cm4gRi5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gcmEoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5CPSExO2Eucz0hMTthLk49ITE7cmV0dXJuIGF9ZnVuY3Rpb24gc2EoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmY9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gVmIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLAphKXx8dGhpc31mdW5jdGlvbiB3YihhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLlg9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gV2EoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmY9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gV2IoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIFhhKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuWD0hMTthLnBhcmVudD1udWxsO2EuYz17fTtyZXR1cm4gYX1mdW5jdGlvbiBSYShhKXthPUEuY2FsbCh0aGlzLGEpfHx0aGlzO2EuZj1udWxsO3JldHVybiBhfWZ1bmN0aW9uIFhiKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5jPSExO3JldHVybiBhfWZ1bmN0aW9uIEdiKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuYz0iIjtyZXR1cm4gYX1mdW5jdGlvbiBLYShhKXtyZXR1cm4gQS5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24geGIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIFlhKGEsCmMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLm89ITE7cmV0dXJuIGF9ZnVuY3Rpb24gU2EoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLkthPSExO3ZvaWQgMD09YS5mJiYoYS5mPSExKTtyZXR1cm4gYX1mdW5jdGlvbiBZYihhKXtyZXR1cm4gRi5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gSGIoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5mPTA7YS5vPTEwO3JldHVybiBhfWZ1bmN0aW9uIHlhKGEpe2E9QS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5mPTA7cmV0dXJuIGF9ZnVuY3Rpb24gWmIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGtiKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuYz1bXTthLmY9ITE7YS5vPSExO3JldHVybiBhfWZ1bmN0aW9uIExhKGEpe2E9QS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5LYT0hMTtyZXR1cm4gYX1mdW5jdGlvbiAkYihhKXtyZXR1cm4gRi5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gSWIoYSwKYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2Eubz0hMTthLmM9MDtyZXR1cm4gYX1mdW5jdGlvbiBxYShhKXthPUEuY2FsbCh0aGlzLGEpfHx0aGlzO2EuZj0hMTthLm09ITE7YS5BPSExO2EubD1bXTthLnM9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gSmIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGFjKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gWmEoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLm11dGVkPSExO3JldHVybiBhfWZ1bmN0aW9uIHJjKCl7dGEuc3x8KHRhLnM9MCk7dGEucysrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9dGEuQiYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT10YS5CKTsxMD50YS5zJiZ3aW5kb3cuc2V0VGltZW91dChyYyw1MDApfWZ1bmN0aW9uIGNiKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5zPTA7YS5jPVtdO2EubT1bXTthLm89W107cmV0dXJuIGF9ZnVuY3Rpb24geWIoYSwKYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gJGEoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGJjKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5jPSExO3JldHVybiBhfWZ1bmN0aW9uIGNjKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gZGIoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIEtiKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5tPSExO3JldHVybiBhfWZ1bmN0aW9uIHpiKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gSGEoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGRjKGEpe3JldHVybiBGLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBNYShhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLnM9ITE7YS5CPSExO2EuSz0hMTthLnU9ITE7YS5EPSExO2EuYz0hMTtyZXR1cm4gYX1mdW5jdGlvbiB6YShhKXtyZXR1cm4gQS5jYWxsKHRoaXMsCmEpfHx0aGlzfWZ1bmN0aW9uIGVjKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5sPTE1MDA7cmV0dXJuIGF9ZnVuY3Rpb24gZWIoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5YPSExO2EudT0hMTthLkQ9ITE7YS5zPSExO2EuYz0wO3JldHVybiBhfWZ1bmN0aW9uIHVhKGEpe2E9QS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5mPTA7YS5sPSExO3JldHVybiBhfWZ1bmN0aW9uIGZjKGEpe3JldHVybiBGLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBnYyhhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLmFiPW51bGw7cmV0dXJuIGF9ZnVuY3Rpb24gYWIoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmFiPW51bGw7YS5sPS0xO2EuZj1nLlNjO3JldHVybiBhfWZ1bmN0aW9uIGhjKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5sPS0xO3JldHVybiBhfWZ1bmN0aW9uIEFiKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gQWEoYSl7YT0KQS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5tPSExO2EuZj0hMTtyZXR1cm4gYX1mdW5jdGlvbiBCYihhKXthPUYuY2FsbCh0aGlzLGEpfHx0aGlzO2EubT0hMTtyZXR1cm4gYX1mdW5jdGlvbiBmYShhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLkZhPSExO2EuTj0hMTthLkRhPSExO2EudT0hMTthLkk9ITE7YS5HYT1sLnMoMTApO2EuYWE9ITA7YS5kYT0hMTthLkc9ITE7YS5YPSExO2EuV2E9IiI7YS5UYT0hMTthLm89ITE7YS5QPSExO2EuSWE9ITE7YS5pbWE9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gQmEoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIENiKGEpe3JldHVybiBGLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBmYihhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLnN0YXR1cz1hLkY7YS5XPSExO2EuST0hMTthLm89ITE7YS5QPSExO2EuaXNQbGF5aW5nPSExO2EuRz0xO2EuSz0wO2Eucz1bXTthLmY9ITE7YS5OPVtdO2EuQj0wO2EudT0KMDthLk89ITE7YS5vbmNlPSExO2EuWj0hMTthLmFhPVtdO2EuRD0hMTtyZXR1cm4gYX1mdW5jdGlvbiBsYShhKXthPUEuY2FsbCh0aGlzLGEpfHx0aGlzO3ZvaWQgMD09YS5TYSYmKGEuU2E9ITEpO3ZvaWQgMD09YS5mJiYoYS5mPSExKTt2b2lkIDA9PWEubCYmKGEubD0hMSk7dm9pZCAwPT1hLnhkJiYoYS54ZD0hMSk7cmV0dXJuIGF9ZnVuY3Rpb24gaWMoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIExiKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gbGIoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLkthPSExO3JldHVybiBhfWZ1bmN0aW9uIEUoYSxjKXt0aGlzLnBsYXllcj0iIjt0aGlzLlY9bnVsbDt0aGlzLlk9IjEiO3RoaXMuaWE9IjIiO3RoaXMua2E9IjMiO3RoaXMuRj0wO3RoaXMubT1bXTt0aGlzLmw9W107dGhpcy5BPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsCnVua25vd246Nn07dGhpcy5mYT0hMTt0aGlzLnN0YXR1cz10aGlzLkY7dGhpcy5pZD1sLmcoMTApO3RoaXMuZ2EoYSk7dGhpcy53YShjKX1mdW5jdGlvbiBBKGEpe3RoaXMuYz10aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmk9ITE7dGhpcy5wbGF5ZXI9YTt0aGlzLmZjPSIiO3RoaXMuRj1udWxsO3RoaXMuVCgpfWZ1bmN0aW9uIEYoYSl7dGhpcy5mPXt9O3RoaXMuYT1udWxsO3RoaXMuRj0wO3RoaXMubD0xNTA7dGhpcy5rYz0wO3RoaXMuSShhKX1mdW5jdGlvbiBtYigpe3RoaXMuZz10aGlzLmk9ITE7dGhpcy5iPVtdO3RoaXMuYz17fX1mdW5jdGlvbiBpYShhLGMpe3RoaXMubD1jfHx7fTt0aGlzLlM9YTt0aGlzLlZhPWEueGEoKTt0aGlzLmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5hLmlkPWwuZygxMCk7dGhpcy5mPWJiLnBvcCgpO3RoaXMuZnx8KGwudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5mPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuZi5pZD0iYWRYZGlzcGxheSIsdGhpcy5mLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5iPXt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjAscG9zaXRpb246IiJ9O3RoaXMuQT0hMTt0aGlzLmk9W107dGhpcy5tPSExfWZ1bmN0aW9uIEMoYSxjKXt2YXIgZD1FcnJvci5jYWxsKHRoaXMsYS50eXBlKTt0aGlzLm1lc3NhZ2U9ZC5tZXNzYWdlOyJzdGFjayJpbiBkJiYodGhpcy5zdGFjaz1kLnN0YWNrKTt0aGlzLnR5cGU9YTt0aGlzLmRhdGE9Yzt0aGlzLmRhdGF8fCh0aGlzLmRhdGE9e30pO3RoaXMuZGF0YS5kZXRhaWxzfHwodGhpcy5kYXRhLmRldGFpbHM9Qy5hLk9kKTt0aGlzLmRldGFpbHM9dGhpcy5kYXRhLmRldGFpbHN9ZnVuY3Rpb24gamEoYSxjLGQsZSl7dGhpcy5jPSJhcHBsaWNhdGlvbi9lY21hc2NyaXB0IGFwcGxpY2F0aW9uL2phdmFzY3JpcHQgYXBwbGljYXRpb24veC1lY21hc2NyaXB0IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCB0ZXh0L2VjbWFzY3JpcHQgdGV4dC9qYXZhc2NyaXB0IHRleHQvanNjcmlwdCB0ZXh0L3gtZWNtYXNjcmlwdCB0ZXh0L3gtamF2YXNjcmlwdCIuc3BsaXQoIiAiKTsKdGhpcy5qYT1hO3RoaXMuYT1jO3RoaXMuQz1lO3RoaXMuc2M9MDt0aGlzLmR1cmF0aW9uPXRoaXMubygpO3RoaXMubmM9dGhpcy5sKCk7dGhpcy5VYj10aGlzLm0oKTt0aGlzLnpjPXRoaXMuRigpO3RoaXMuc2Q9ITE7dGhpcy5pPXRoaXMuZz0iIjt0aGlzLmVycm9yPW51bGw7dGhpcy5GZD1bXX1mdW5jdGlvbiBWKGEsYyl7YT12b2lkIDA9PT1hPyIiOmE7Yz12b2lkIDA9PT1jPyExOmM7dmFyIGQ9dmEuY2FsbCh0aGlzKXx8dGhpcztkLnNyYz1hO2QuZGE9YztkLmE9bnVsbDtkLkxhPVtdO2QuWj1bXTtkLmI9W107ZC5pPVtdO2QuVz0hMTtkLlk9ITE7ZC5jPSExO2QubD0hMTtkLkQ9MTtkLnNyYy5sZW5ndGgmJmQubG9hZChkLnNyYyk7cmV0dXJuIGR9ZnVuY3Rpb24gbmIoYSl7YT12b2lkIDA9PT1hPyIiOmE7dmFyIGM9SWEuY2FsbCh0aGlzLG51bGwpfHx0aGlzO2MuYT1udWxsO2Muc3JjPWE7cmV0dXJuIGN9ZnVuY3Rpb24gSWEoYSxjKXt0aGlzLkM9YTt0aGlzLnBvc2l0aW9uPXZvaWQgMD09PQpjPyJwcmVyb2xsIjpjO3RoaXMucz1udWxsO3RoaXMuamE9W107dGhpcy5iPVtdO3RoaXMuZz1bXTt0aGlzLmR1cmF0aW9uPTB9ZnVuY3Rpb24gVGEoYSxjKXt0aGlzLmVycm9yPWE7dGhpcy5kYXRhPWM7dGhpcy5qYT1bXX1mdW5jdGlvbiBOYShhLGMpe3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9YysiY29udGFpbmVyIjthLmFwcGVuZENoaWxkKGQpO2E9Y2EuY2FsbCh0aGlzLGQsYyl8fHRoaXM7YS5jb250YWluZXI9ZDthLmphPVtdO2EubD1bXTthLmY9LTE7YS5mb3JtYXQ9InBvcnRyYWl0IjthLkQoKTtyZXR1cm4gYX1mdW5jdGlvbiBjYShhLGMsZCl7dmFyIGU9dmEuY2FsbCh0aGlzKXx8dGhpcztlLndiPWE7ZS5pZD1jO2UuYj1PYmplY3QuYXNzaWduKHt9LHt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixwcmVsb2FkOiJhdXRvIixhdXRvcGxheToiIn0sZCk7ZS5hPWUucygpO2UuYS5zZXRBdHRyaWJ1dGUoInBvc3RlciIsImh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3ZlcnRpY2FsaXpyL2JsYWNrLnBuZyIpOwplLk89IjAwMDAiO2UuUD0iIjtlLnBhcmVudD1udWxsO2UuRygpO2UuSSgpO3JldHVybiBlfWZ1bmN0aW9uIFMoYSl7dmFyIGM9dmEuY2FsbCh0aGlzKXx8dGhpcztjLndiPWE7Yy5jb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5jb250YWluZXIuaWQ9ImxpbW9yb290IjtjLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2MuY29udGFpbmVyLnN0eWxlLnRvcD0iMCI7Yy5jb250YWluZXIuc3R5bGUubGVmdD0iMCI7Yy5jb250YWluZXIuc3R5bGUud2lkdGg9IjEwMCUiO2MuY29udGFpbmVyLnN0eWxlLmhlaWdodD0iMTAwJSI7Yy5iPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MudT1udWxsO2MuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5sPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKYy5jPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuYT1udWxsO2MubT1udWxsO2MuZj1udWxsO2MubGFiZWw9bnVsbDtjLnM9bnVsbDtjLks9LTE7Yy5wbGF5ZXI9bmV3IE5hKGMuY29udGFpbmVyLCJsaW1vX3ZpZGVvIik7Yy5wbGF5ZXIucGFyZW50PWM7Yy5wbGF5ZXIub24oImNvbXBsZXRlIixmdW5jdGlvbigpe2MuYmEoKX0pO2Mub24oInZpZGVvc3RhcnQiLGZ1bmN0aW9uKCl7Yy5JJiYhYy5WJiYoZy5qLnRyYWNrKCJ2cnRjbHpyX3JldHVybmVkIiwiIiwhMCksYy5WPSEwKX0pO2MuWT0hMTtjLkE9W107Yy5pPVtdO2MuVz0wO2MuST0hMTtjLlY9ITE7Yy5EPSExO2MubGEoKTtyZXR1cm4gY31mdW5jdGlvbiBSKGEpe3ZhciBjPVAuY2FsbCh0aGlzKXx8dGhpcztnLmoudHJhY2soInZydGNsenJfc2V0dXAiLCIiLCEwKTtjLm09YTtjLnBhcmVudD1udWxsO2MuQT0hMTtjLnM9Zy52LmIoInZlcnRpY2FsaXpyIil8fHt9O2MuYT1uZXcgUztjLmEuYT1jO2MucWM9Yy5zLmFsaWFzfHwKInN2bXByZXZpZXciOy0xIT09d2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiJnByZXZpZXciKSYmKGMucWM9InN2bXByZXZpZXciKTtjLlA9KGMucy5hcGl8fCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL2NvbnN1bXB0aW9ucy9vZmZlci9ieV9hbGlhcy9bYWxpYXNdLyIpLnJlcGxhY2UoIlthbGlhc10iLGMucWMpKyI/Z2Rwcj1bZ2Rwcl0mZ2Rwcl9jb25zZW50PVtnZHByX2NvbnNlbnRdIjtjLmI9W107Yy5LPSExO2MuVSgpO2MubXx8KGMuTygpLGMudSgpKTtyZXR1cm4gY31mdW5jdGlvbiBXKCl7dmFyIGE9UC5jYWxsKHRoaXMpfHx0aGlzO2EuWj0iaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiO2EuYT1udWxsO2EuYj0hMTthLmY9ITE7YS5tPSExO2EuTz0wO2EuQT0wO2Eucz0wO2EuSz1bXTtyZXR1cm4gYX1mdW5jdGlvbiBPYSgpe3ZhciBhPU0uY2FsbCh0aGlzKXx8dGhpczsKYS5hPW51bGw7cmV0dXJuIGF9ZnVuY3Rpb24gb2EoKXt2YXIgYT1NLmNhbGwodGhpcyl8fHRoaXM7YS5hPW51bGw7YS50YSgpO2EuWT0hMTthLlo9IiI7cmV0dXJuIGF9ZnVuY3Rpb24gTSgpe3ZhciBhPVAuY2FsbCh0aGlzKXx8dGhpczthLnZpZGVvVGFnPW51bGw7YS5pYT0xRTM7YS5mPSExO2EuUD0hMTthLkE9ITE7YS5LPSExO2EuYmE9ITE7YS5JPSExO3JldHVybiBhfWZ1bmN0aW9uIFAoKXt2YXIgYT12YS5jYWxsKHRoaXMpfHx0aGlzO2EuZXZlbnQ9e1hiOiJyZWFkeSIsT2E6ImVycm9yIixOYToiZW5kZWQiLG9jOiJ0aW1ldXBkYXRlIixGYzoiaW1wcmVzc2lvbiIsSmM6InN0YXJ0IixFYzoiZmlyc3RRdWFydGlsZSIsR2M6Im1pZHBvaW50IixLYzoidGhpcmRRdWFydGlsZSIsRGM6ImNyZWF0aXZlVmlldyIsb2Q6InNraXAiLHBkOiJ0aW1lY2hhbmdlIixsYzoiY2xpY2t0aHJvdWdoIixIYzoicGF1c2UiLG5kOiJyZXN1bWUiLE1kOiJtdXRlIixSZDoidW5tdXRlIn07YS5DPW51bGw7CmEuYz1udWxsO2EuaT1udWxsO2EuRz0tMTthLlc9bnVsbDtyZXR1cm4gYX1mdW5jdGlvbiB1KGEsYyxkKXt0aGlzLmE9bnVsbDt0aGlzLmhkKGEpO2EuUy5jYT90aGlzLmJhPWEuUy5jYSgpOnRoaXMuYmE9IiI7YS5TLkJkJiZhLlMuQmQoe3BhdXNlOnRoaXMuamMuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5NYi5iaW5kKHRoaXMpLG11dGU6dGhpcy5JYi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLkpkLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEuVmE7dGhpcy5wbGF5ZXI9dGhpcy5hLlM7dGhpcy5mPW51bGw7dGhpcy5pPWM7dGhpcy5zPW51bGw7dGhpcy52aWRlbz17fTt0aGlzLmhhPXt9O3RoaXMuWGQ9Zy5qLmcoMTApO3RoaXMuZ2E9MDt0aGlzLlo9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5aPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5TKSYmdGhpcy5hLlMuQ2EmJihhPXRoaXMuYS5TLkNhKCkpLAp0aGlzLlo9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuUWM9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5WPSExO3RoaXMubD1udWxsO3RoaXMuQz17fTt0aGlzLlRhPS0xO3RoaXMubT10aGlzLlZiPSExO3RoaXMuY29udHJvbHM9bnVsbDt0aGlzLmFlPWcuai5nKDEwKTt0aGlzLnphPWcuai5nKDEwKTt0aGlzLnRhPWcuai5nKDEwKTt0aGlzLlBiPWcuai5nKDEwKTt0aGlzLmc9e307dGhpcy5KYj10aGlzLnBhPXRoaXMuUD0hMTtnLmouZygxMCk7dGhpcy5GYT10aGlzLmlhPXRoaXMuTj10aGlzLmxhPSExO3RoaXMuWT1bXTt0aGlzLks9e307dGhpcy5rYT10aGlzLkdhPSExO3RoaXMuQj1udWxsO3RoaXMuYz10aGlzLlU9ITE7dGhpcy5BPW51bGw7dGhpcy53YT17fTt0aGlzLkRhPXt9O3RoaXMuaWI9ITE7dGhpcy5kaXNwbGF5PW51bGx9ZnVuY3Rpb24gb2IoKXt0aGlzLmk9CnRoaXMuZGM9IiI7dGhpcy5iO3RoaXMuYT17fX1mdW5jdGlvbiBDYSgpe31mdW5jdGlvbiB2YSgpe3RoaXMuRj1uZXcgTWFwO3RoaXMubz1uZXcgTWFwO3RoaXMuTj1uZXcgTWFwfWZ1bmN0aW9uIGRhKGEpe3RoaXMuYT10aGlzLnBhcnNlKGEpO3RoaXMuZj0iIn1mdW5jdGlvbiB2KGEpe3RoaXMuZGF0YT1hfHx7fTt0aGlzLnR5cGU9dGhpcy5lcnJvck1lc3NhZ2U9IiJ9ZnVuY3Rpb24geigpe3RoaXMuRWQ9ITE7dGhpcy5VPSJzZXR1cCI7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuUWIuYmluZCh0aGlzKSk7dGhpcy5vYT10aGlzLm5hPW51bGw7dGhpcy51PXRoaXMuZmE9ITE7dGhpcy5PPVtdO3RoaXMuaGI9ITE7dGhpcy5pPXt9O3RoaXMuZ2EoKTt0aGlzLmJhPSExO3RoaXMuST1udWxsO3RoaXMubD1uZXcgTWFwO3RoaXMueWIoKX1mdW5jdGlvbiBIKCl7Zy5IPXRoaXM7d2E9dGhpczt0aGlzLkphPSExO3RoaXMuUGE9IiI7dGhpcy5uYT10aGlzLlU9dGhpcy5CPQpudWxsO3RoaXMuT2I9dGhpcy5iYT10aGlzLkFiPSExO3RoaXMuZj0iIjt0aGlzLnpiPSExO3RoaXMuQmE9dGhpcy5lYz0iIjt0aGlzLnliPXRoaXMuYj10aGlzLmE9dGhpcy5kZD0hMTt0aGlzLmc9W107dGhpcy5qYj10aGlzLkQ9IiI7dGhpcy5mYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLldhPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy51PSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLkhiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLkk9IiI7dGhpcy5LPVtdO3RoaXMuTz1bXTt0aGlzLmdhPVtdO3RoaXMuWj0iIjt0aGlzLmFhPSExO3RoaXMuR2E9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5XPSExO3RoaXMuTmI9dGhpcy5oYT1udWxsO3RoaXMubGI9dGhpcy5pYT10aGlzLmliPXRoaXMuVGE9dGhpcy5wYj10aGlzLnFhPXRoaXMuRz0hMTsKdGhpcy5BPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnFiPSIiO3RoaXMuZWE9MDt0aGlzLmRhPXRoaXMueGI9ITE7dGhpcy5iaXRyYXRlPTFFMzt0aGlzLmthPXRoaXMubGE9IiI7dGhpcy5rYj1udWxsO3RoaXMuR2Q9ITE7dGhpcy5OPXRoaXMuWT1udWxsO3RoaXMuaT17fTt0aGlzLkRhPTA7dGhpcy5CYj10aGlzLm89ITE7dGhpcy5WPTEwO3RoaXMudGI9ZnVuY3Rpb24oKXt9O3RoaXMuemE9LTE7dGhpcy5oYj10aGlzLm9hPSExO3RoaXMucGE9e319ZnVuY3Rpb24gcGIoKXt0aGlzLmE9dGhpcy5iPSExfWZ1bmN0aW9uIGdiKGEsYyxkLGUsZil7dGhpcy5hPWE7dGhpcy5mPXRoaXMuRj0hMTt0aGlzLm09ZDt0aGlzLmM9ITE7dGhpcy50aW1lb3V0PTA7dGhpcy5vPSExO3RoaXMuZz0tMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5hPW5ldyBQYShhKSk7dmFyIGg9dGhpcy5iPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFjfHwKNCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHwodGhpcy5pKCksdGhpcy5sKGgpLGcudi5iKCJjb21wYW5pb25zIikmJihoPXRoaXMuQShoKSksYyhoKSk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzPyh0aGlzLmkoKSx0aGlzLmwoaCksZChoKSk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmZy5qLkEodGhpcy5hLnVybCkmJiFmJiZsLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsInN0YXR1czAiLCEwKTtlJiY0IT1oLnJlYWR5U3RhdGUmJmUoaCl9LmJpbmQodGhpcyl9ZnVuY3Rpb24gUGEoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319ZnVuY3Rpb24gcWIoKXt0aGlzLmE9e307dGhpcy5jPXt9O3RoaXMuY2xpZW50PXt9O3RoaXMuaT17fX1mdW5jdGlvbiBoYigpe31mdW5jdGlvbiBKYSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIiwKSmEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEphKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixKYSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixKYSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEphKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEphKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixKYSk7c2M9ITA7Zm9yKHZhciBhPTA7YTxiYi5sZW5ndGg7YSsrKWJiW2FdLmxvYWQoKTtmb3IoYT0wO2E8YmIubGVuZ3RoO2ErKyl7dmFyIGM9YmJbYV0ucGxheSgpO2lmKHZvaWQgMCE9PWMpYy50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1NYiYmKE1iKCksTWI9ITEpfWZ1bmN0aW9uIHRjKCl7dmFyIGE9d2luZG93Lk9PO2F8fChhPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGF9ZnVuY3Rpb24gdWMoKXt0cnl7bC5HKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfWNhdGNoKGYpe31pZihnLnYuZyl7dmFyIGE9CkljKGZ1bmN0aW9uKCl7bC5oYSh3aW5kb3csTmIuYygpLHtpZDphfSl9LDUwMCk7aWYobC5oYil3YS5XZCgpO2Vsc2V7Zy52LmEucGF1c2VCdXR0b258fChnLnYuYS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cmcudi5hLnBsYXlCdXR0b258fChnLnYuYS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKZy52LmEubXV0ZUJ1dHRvbnx8KGcudi5hLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpnLnYuYS51bm11dGVCdXR0b258fChnLnYuYS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpnLnYuYS5za2lwYWJsZUJ1dHRvbnx8KGcudi5hLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7Zy52LmEuc2tpcEJ1dHRvbnx8KGcudi5hLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKd2EuUmF8fG5ldyBIO2lmKGcudi5iKCJieXBhc3MiKSl7dmFyIGM9Zy52LmIoImNsaWVudENvbmZpZyIpO2lmKCJvYmplY3QiPT09dHlwZW9mIGMpe3ZhciBkPWMuYWxpYXM7dmFyIGU9Yy5zZXJ2ZXJ9ZCYmZT8oZy5ILmRhPSEwLGcuSC5UKGQsZSksZy5ILkZiKCkpOmcuSC5SYShnLnYuYS5nbG9iYWxDb25maWcsZy52LmEuY2xpZW50Q29uZmlnLGcudi5hLnByZWNoZWNrZWQsZy52LmEub25SZWFkeSxnLnYuYS5vbkZhaWx1cmUsZy52LmEpfWVsc2UgZy5ILlJhKGcudi5hLmdsb2JhbENvbmZpZyxnLnYuYS5jbGllbnRDb25maWcsZy52LmEucHJlY2hlY2tlZCxnLnYuYS5vblJlYWR5LGcudi5hLm9uRmFpbHVyZSxnLnYuYSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITB9fWVsc2UgSmModWMsNTApfWZ1bmN0aW9uIFgoYSxjKXtpZihnLnYuZyYmd2EuUmEpeyhnLnYuYS5hZFRhZ3x8Zy52LmEucHJlcm9sbEFkVGFnKSYmYS5wYXVzZSgpO2wuYSh2LmIsYS5DYSgpKTtpZihhLmdldEN1cnJlbnRUaW1lKXt2YXIgZD0KYS5nZXRDdXJyZW50VGltZSgpO2QmJmwudHJhY2soImFjdGl2YXRlZEF0IixkKX1jP3dhLkphPSEwOmwudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2Q9bmV3IGs7ZC5BKGEpO2QuRyh3YSk7ZC5GKGcudi5hKTtkLncoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7WChhLGMpfS5iaW5kKHRoaXMpLDUwKX1xYi5wcm90b3R5cGUubD1mdW5jdGlvbihhKXtyZXR1cm4gMDxPYmplY3Qua2V5cyhhfHx7fSkubGVuZ3RoJiZhLmNvbnN0cnVjdG9yPT09T2JqZWN0fTtxYi5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pW2FdfHx0aGlzLmNsaWVudFthXXx8dGhpcy5hW2FdfTtxYi5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybntlbWJlZDp0aGlzLmEsZ2xvYmFsOnRoaXMuYyxjbGllbnQ6dGhpcy5jbGllbnQsY3VzdG9tZXI6dGhpcy5pfX07UWEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocWIucHJvdG90eXBlLHtnOntjb25maWd1cmFibGU6ITAsCmVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubCh0aGlzLmEpfX19KTt2YXIgZz17djpudWxsLEg6bnVsbCxqOm51bGx9O2cudj1uZXcgcWI7UGEucHJvdG90eXBlLmE9ZnVuY3Rpb24oYSl7dGhpcy5kYXRhLmhvbWFkX21hY3Jvcz1hfTtQYS5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXt0cnl7dGhpcy5hKEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChjKXt9fTtnYi5wcm90b3R5cGUuQT1mdW5jdGlvbihhKXtpZihhJiZhLnJlc3BvbnNlVGV4dCYmYS5yZXNwb25zZVRleHQuaW5kZXhPZiYmMDw9YS5yZXNwb25zZVRleHQuaW5kZXhPZigiSUZyYW1lUmVzb3VyY2UiKSl0cnl7dmFyIGM9e307Yy5yZXNwb25zZVRleHQ9YS5yZXNwb25zZVRleHQ7Zm9yKHZhciBkPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYy5yZXNwb25zZVRleHQsInRleHQveG1sIikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNvbXBhbmlvbkFkcyIpLGU9MDtlPGQubGVuZ3RoO2UrKylmb3IodmFyIGY9CmRbZV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIklGcmFtZVJlc291cmNlIiksaD0wO2g8Zi5sZW5ndGg7aCsrKXt2YXIgbT1nLmouQWQoZltoXSksRD1nLmouSyhtLGcuSCwhMCk7Zy5qLmMobSk7Yy5yZXNwb25zZVRleHQ9Yy5yZXNwb25zZVRleHQucmVwbGFjZShtLEQpO2MucmVzcG9uc2VYTUw9KG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhjLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKX1nLmoudHJhY2soInN0YXRzX2hkX2NvbXBhbmlvbiIsIiIsITApO3JldHVybiBjfWNhdGNoKEwpe31yZXR1cm4gYX07Z2IucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSl7dmFyIGM9ITE7aWYoYSYmIShhLnJlc3BvbnNlJiZhLnJlc3BvbnNlLmluZGV4T2YmJjA8PWEucmVzcG9uc2UuaW5kZXhPZigic3RhdHNfaGRfYWxpdmUiKSkpdHJ5e3ZhciBkPWEuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7aWYoMDw9ZC5pbmRleE9mKCJkYXRlOiIpfHwwPD1kLmluZGV4T2YoIkRhdGU6IikpYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJEYXRlIik7CmlmKGMpe3ZhciBlPW5ldyBEYXRlKGMpO2cuSC5vYXx8KGcuSC5vYT1lLmdldFRpbWUoKSk7Zy5ILmhiPWUuZ2V0VGltZSgpO3ZhciBmPWcuSC5oYi1nLkgub2E7aWYoZil7dmFyIGg9TWF0aC5mbG9vcihmLzZFNCksbT1NYXRoLmZsb29yKGYvMzZFNSksRD1NYXRoLmZsb29yKGYvODY0RTUpO2E9IiI7NTw9aCYmKGE9IjVtaW4iKTsxMDw9aCYmKGE9IjEwbWluIik7MjA8PWgmJihhPSIyMG1pbiIpOzMwPD1oJiYoYT0iMzBtaW4iKTs0NTw9aCYmKGE9IjQ1bWluIik7MTw9bSYmKGE9bSsiaCIpOzE8PUQmJihhPUQrImQiKTthJiZnLkgucGEmJiFnLkgucGFbYV0mJihnLkgucGFbYV09ITAsZy5qLnRyYWNrKCJzdGF0c19oZF9hbGl2ZSIsYSwhMCkpfX19Y2F0Y2goTCl7fX07Z2IucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLnRpbWVvdXQmJih0aGlzLmc9d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksdGhpcy50aW1lb3V0KSl9O2diLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7dGhpcy5nJiYKd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmcpO3RoaXMuZz0hMX07Z2IucHJvdG90eXBlLnM9ZnVuY3Rpb24oKXt0aGlzLmkoKTt0aGlzLm89ITA7dGhpcy5iLm89ITA7dGhpcy5iLmFib3J0KCl9O2diLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYz1hO2E9IiI7Zm9yKHZhciBkIGluIGMpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChjW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5iLnVybENhbGxlZD10aGlzLmEudXJsO3RyeXt0aGlzLmM/dGhpcy5iLm9wZW4odGhpcy5hLm1ldGhvZCx0aGlzLmEudXJsLCExKTp0aGlzLmIub3Blbih0aGlzLmEubWV0aG9kLHRoaXMuYS51cmwsITApLHRoaXMuRnx8KHRoaXMuYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksYSYmMDxhLmxlbmd0aCYmYS5pbmRleE9mJiYoMDxhLmluZGV4T2YoImhvbWFkX3RyYWNrX2tleSIpfHwwPGEuaW5kZXhPZigiaG9tYWRfYXQiKSkmJihhKz0iJmhvbWFkX3ZlcnNpb249MjAyMTAxMTFfMTAxNyIpLHRoaXMuYi5zZW5kKGEpLHRoaXMudSgpfWNhdGNoKGUpe2E9dGhpcy5hLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxnLmouQSh0aGlzLmEudXJsKSYmIWEmJmwudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKSx0aGlzLm0mJnRoaXMubSgpfXJldHVybiB0aGlzLmJ9O3BiLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3RoaXMuYj1hfTtwYi5wcm90b3R5cGUuYz0KZnVuY3Rpb24oYSl7dGhpcy5hPWF9O3BiLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShlLGYpe2UuYWRkRXZlbnRMaXN0ZW5lcihmLGZ1bmN0aW9uKCl7fSl9dmFyIGM9e1RlOiJBZENsaWNrVGhydSIsVmU6IkFkRXJyb3IiLFdlOiJBZFN0b3BwZWQiLFplOiJBZExpbmVhckNoYW5nZSIsJGU6IkFkVGFnUGFyc2VkIixjZjoiQWRWaWRlb0NvbXBsZXRlIixmZjoiQWRMb2FkZWQiLGdmOiJBZFNraXBwZWQiLGhmOiJBZFN0YXJ0ZWQiLFhlOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsWWU6IkFkSW1wcmVzc2lvbiIsVWU6IkFkQ3JlYXRpdmVWaWV3IixhZjoiQWRWaWRlb01pZHBvaW50IixiZjoiQWRQYXVzZWQiLGRmOiJBZFZpZGVvU3RhcnQiLGVmOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYz13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYyljLmhhc093blByb3BlcnR5KGQpJiYKYSh0aGlzLmIsY1tkXSx7fSl9O3BiLnByb3RvdHlwZS5nPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShkLGUpe2QuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKCl7fSl9aWYodGhpcy5hJiZ0aGlzLmEuSWMpZm9yKHZhciBjIGluIHRoaXMuYS5JYyl0aGlzLmEuSWMuaGFzT3duUHJvcGVydHkoYykmJmEodGhpcy5hLHRoaXMuYS5JY1tjXSx7fSk7dGhpcy5hJiZ0aGlzLmEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe30uYmluZCh0aGlzKSwxMCl9O3BiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5iJiZ0aGlzLmkoKTt0aGlzLmEmJnRoaXMuZygpfTtILnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5KYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlBhLGFkdGFnbW9kaWZpZXI6dGhpcy5CLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5VLGFkdGFncmVnZXg6dGhpcy5uYSxiaXRyYXRlOnRoaXMuYml0cmF0ZSxqc3BvcHVwczp0aGlzLkFiLApzaWRlbG9hZHM6dGhpcy5iYSxkaXNhYmxldGVzdHM6dGhpcy5PYixob21hZEFsaWFzOnRoaXMuZixpc0luaXRpYWxpemVkOnRoaXMuemIsZ2xvYmFsQ29uZmlnOnRoaXMuZWMsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuYSxpc1ZlcmlmaWVkOnRoaXMuYixpc0Jsb2NrZWQ6dGhpcy55YixzZXJ2ZXI6dGhpcy5nLHN2bUNvbmZpZzp0aGlzLkQsaG9tYWRBZHBhdGg6dGhpcy5qYixIT01BRF9WRVJJRklFRDp0aGlzLmZiLEhPTUFEX0JMT0NLRUQ6dGhpcy5XYSxIT01BRF9OT0JMT0NLRVI6dGhpcy51LEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkhiLHRlc3RIaWRlOnRoaXMuSSx0ZXN0VGFnczp0aGlzLkssdGVzdFRhZ3NKUzp0aGlzLk8sdGVzdFRhZ3NYSFI6dGhpcy5nYSx0ZXN0M1BDb29raWU6dGhpcy5aLHRocm90dGxlOnRoaXMuR2EsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5XLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuTmIsCmFkQmxvY2tlckRldGVjdGVkOnRoaXMuRyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMucWEsdXNlU3RyaWN0Q2hlY2tzOnRoaXMucGIsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuVGEsY29uZmlnRmFpbHVyZXM6dGhpcy5BLHNpdGVDb25maWc6dGhpcy5pLHNlcnZlcklkOnRoaXMuRGEsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLm8sdnBhaWQ6dGhpcy5pYSxza2lwQWxsb3dlZDp0aGlzLmxiLHZtYXBzOnRoaXMucWIsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLmRhLGFkRmFsbGJhY2tVUkw6dGhpcy5sYSxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2EseWllbGRsYWI6dGhpcy5rYixfY29uZmlnOmcudi5mKCl9fTtILnByb3RvdHlwZS5TYj1mdW5jdGlvbigpe3ZhciBhPSExLGM7Zm9yKGMgaW4gdGhpcy5BKSJib29sZWFuIj09dHlwZW9mIHRoaXMuQVtjXSYmMT09dGhpcy5BW2NdJiYoYT0hMCk7cmV0dXJuIGF9O0gucHJvdG90eXBlLmdkPWZ1bmN0aW9uKGEpe3RoaXMuQVthXT0KITB9O0gucHJvdG90eXBlLlFiPWZ1bmN0aW9uKCl7dmFyIGE9W10sYztmb3IoYyBpbiB0aGlzLkEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5BW2NdJiYxPT10aGlzLkFbY10mJmEucHVzaChjKTtyZXR1cm4gYX07SC5wcm90b3R5cGUuYz1mdW5jdGlvbihhLGMpe3ZhciBkPXZvaWQgMD09PWQ/ITE6ZDtpZighKHRoaXMuSmF8fHZvaWQgMCE9PWMmJmMpKXJldHVybiBuZXcgUGEoYSk7Yz1nLmouQShhKTt2YXIgZT1sLmMoYSk7aWYoYyl7dmFyIGY9dGhpcy53YSgpP2E6ZS5wcm90b2NvbCsiOi8vIitlLmF1dGhvcml0eSsiLyI7YT1lLnBhdGguc3Vic3RyKDEpfWVsc2UgZj10aGlzLnMoKSxhPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpO2QmJih0aGlzLlBhfHx0aGlzLkJ8fHRoaXMuVXx8dGhpcy5uYXx8Zy52LmIoInRjZl9jb25maWciKSkmJihhPXRoaXMuQ2IoYSkpO2Q9bmV3IFBhKGYpO2QudXJsPWY7Yz1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKToKdGhpcy50YShlLmhvc3QpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7ZC5kYXRhLmhvbWFkX3VybF9zdWZmaXg9YTtkLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9bC5CKGEpO2QubWV0aG9kPSJQT1NUIjtyZXR1cm4gZH07SC5wcm90b3R5cGUud2E9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmcmJnRoaXMuZy5sZW5ndGgmJjA8dGhpcy5nLmxlbmd0aCYmKGE9dGhpcy5nWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1hLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9O0gucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpe3ZhciBjPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuZiYmMDx0aGlzLmYubGVuZ3RoKXJldHVybiB0aGlzLmY7Zm9yKGMgaW4gdGhpcy5mKXt2YXIgZD10aGlzLmZbY107aWYoZC5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJgpkLnVybD09PWEpcmV0dXJuIGQuYWxpYXN9cmV0dXJuIm5vbmUifTtILnByb3RvdHlwZS5mYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdbdGhpcy5EYV19O0gucHJvdG90eXBlLnM9ZnVuY3Rpb24oKXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKSsiIixjPXRoaXMuZmEoKTthPWwuaWIoYSk7dmFyIGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBjLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKStkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX07SC5wcm90b3R5cGUuRGI9ZnVuY3Rpb24oYSl7dmFyIGM9ITEsZD0iIjtpZihhLmV2YWwpdHJ5e2Q9ZXZhbCgiKCIrYS5ldmFsKyIpKCkiKX1jYXRjaChlKXtjPSEwfWVsc2UgYz0hMDtjJiYiS0VFUCIhPT1hLmZhbGxiYWNrJiYoZD1hLmZhbGxiYWNrKTtyZXR1cm4gZH07SC5wcm90b3R5cGUuWmI9ZnVuY3Rpb24oYSxjKXthPWwuYyhhKTt2YXIgZDtmb3IoZCBpbiBjKXtpZihjW2RdLnN1YnZhbHVlcyl7dmFyIGU9CmRlY29kZVVSSUNvbXBvbmVudChhLnF1ZXJ5S2V5W2RdKS5zcGxpdCgiJiIpO3ZhciBmPXt9O2Zvcih2YXIgaD0wO2g8ZS5sZW5ndGg7aCsrKXt2YXIgbT1lW2hdLnNwbGl0KCI9Iik7ZlttWzBdXT1tWzFdfWZvcih2YXIgRCBpbiBjW2RdLnN1YnZhbHVlcylmW0RdPXRoaXMuRGIoY1tkXS5zdWJ2YWx1ZXNbRF0pO2U9W107Zm9yKEQgaW4gZillLnB1c2goRCsiPSIrZltEXSk7Zj1lPWVuY29kZVVSSUNvbXBvbmVudChlLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuRGIoY1tkXSk7YS5xdWVyeUtleVtkXT1mfWM9W107Zm9yKGQgaW4gYS5xdWVyeUtleSljLnB1c2goZCsiPSIrYS5xdWVyeUtleVtkXSk7cmV0dXJuIGEuaG9zdCthLnBhdGgrIj8iK2Muam9pbigiJiIpfTtILnByb3RvdHlwZS5DYj1mdW5jdGlvbihhKXt0aGlzLlBhJiYoYSs9dGhpcy5QYSk7aWYodGhpcy5CKWZvcih2YXIgYyBpbiB0aGlzLkIpdGhpcy5CLmhhc093blByb3BlcnR5KGMpJiYoYT1hLnJlcGxhY2UoYyx0aGlzLkJbY10pKTsKaWYobC5PKWZvcih2YXIgZD0wO2Q8bC5PLmxlbmd0aDtkKyspe3ZhciBlPWwuT1tkXTtmb3IoYyBpbiBlKWE9YS5yZXBsYWNlKGMsZVtjXSl9dGhpcy5VJiYoYT10aGlzLlpiKGEsdGhpcy5VKSk7aWYoZD1nLnYuYigidGNmX2NvbmZpZyIpKWM9ZC5jb25zZW50X3N0cmluZ19wbGFjZWhvbGRlcnx8IltnZHByX2NvbnNlbnRdIixkPWQuZ2Rwcl9hcHBsaWVzX3BsYWNlaG9sZGVyfHwiW2dkcHJdIixnLlVhJiYoYT1hLnJlcGxhY2UoYyxnLlVhLmRjfHwidW5kZWZpbmVkIiksYT1hLnJlcGxhY2UoZCxnLlVhLlZjPyJ0cnVlIjoiZmFsc2UiKSk7cmV0dXJuIGF9O0gucHJvdG90eXBlLm1hPWZ1bmN0aW9uKGEpe2cudi5iKCJnZHByIikmJihhPW5ldyBkYShhKSwoIWEuYigiZ2RwciIpfHxhLmIoImdkcHIiKSYmMD09PWEuZygiZ2RwciIpLmxlbmd0aCkmJmEuaSgiZ2RwciIsIltnZHByXSIpLGEuYigiY29uc2VudCIpfHxhLmIoImdkcHJfY29uc2VudCIpfHxhLmwoKSxhLmIoImNvbnNlbnQiKSYmCjA9PT1hLmcoImNvbnNlbnQiKS5sZW5ndGgmJmEuaSgiY29uc2VudCIsIltnZHByX2NvbnNlbnRdIiksYS5iKCJnZHByX2NvbnNlbnQiKSYmMD09PWEuZygiZ2Rwcl9jb25zZW50IikubGVuZ3RoJiZhLmkoImdkcHJfY29uc2VudCIsIltnZHByX2NvbnNlbnRdIiksYT1hLnRvU3RyaW5nKCkpO3ZhciBjPWcudi5iKCJ0Y2ZfY29uZmlnIik7aWYoYyl7dmFyIGQ9Yy5jb25zZW50X3N0cmluZ19wbGFjZWhvbGRlcnx8IltnZHByX2NvbnNlbnRdIjtjPWMuZ2Rwcl9hcHBsaWVzX3BsYWNlaG9sZGVyfHwiW2dkcHJdIjtnLlVhJiYoYT1hLnJlcGxhY2UoZCxnLlVhLmRjfHwidW5kZWZpbmVkIiksYT1hLnJlcGxhY2UoYyxnLlVhLlZjPyIxIjoiMCIpKX1lbHNlIGE9YS5yZXBsYWNlKCJbZ2Rwcl9jb25zZW50XSIsZy5VYS5kY3x8InVuZGVmaW5lZCIpLGE9YS5yZXBsYWNlKCJbZ2Rwcl0iLGcuVWEuVmM/IjEiOiIwIik7cmV0dXJuIGF9O0gucHJvdG90eXBlLk1iPWZ1bmN0aW9uKCl7dGhpcy5pJiYKdGhpcy5pLmNsaWVudEFQSXMmJnRoaXMuSWIodGhpcy5pLmNsaWVudEFQSXMpfTtILnByb3RvdHlwZS5JYj1mdW5jdGlvbihhKXtpZihhKXt2YXIgYz1uZXcgcGI7YS5wdWJsaXNoZXJBUEkmJmMuZihhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmMuYyhhLnBsYXllcik7Yy53KCl9fTtILnByb3RvdHlwZS5UPWZ1bmN0aW9uKGEsYyl7dGhpcy5mPWE7dGhpcy5nPWM7dGhpcy5hPSEwfTtILnByb3RvdHlwZS5SYT1mdW5jdGlvbihhLGMsZCxlLGYsaCl7d2E9dGhpczt0aGlzLnpiPSEwO3RoaXMuZWM9YTt0aGlzLkJhPWM7dGhpcy5kZD1kO3RoaXMuaGE9ZTt0aGlzLnRiPWY7dGhpcy5pPWh8fHt9O3RoaXMuTWIoKTt0aGlzLlliKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkJhKXRoaXMuVGIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuQmEpdHJ5e3RoaXMuQmE9YygpLHRoaXMuYmMoKX1jYXRjaChtKXt0aGlzLkFhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy5CYSl0cnl7dGhpcy5CYT1jLHRoaXMuYmMoKX1jYXRjaChtKXt0aGlzLkFhKCJub0NsaWVudENvbmZpZyIpfX07SC5wcm90b3R5cGUubT1mdW5jdGlvbihhKXt2YXIgYz1udWxsO3RyeXtjPW5ldyBFdmVudChhKX1jYXRjaChkKXtjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGMuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gY307SC5wcm90b3R5cGUuV2Q9ZnVuY3Rpb24oKXt0aGlzLmE9ITE7dGhpcy5iPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMudSkpO3RoaXMuRigpfTtILnByb3RvdHlwZS5GYj1mdW5jdGlvbigpe3RoaXMuYj10aGlzLkphPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMuSGIpKTt0aGlzLkYoKX07SC5wcm90b3R5cGUuWWI9ZnVuY3Rpb24oKXt0aGlzLmwobmV3IFBhKHRoaXMuZWMrdGhpcy5QKCJnbG9iYWwiKSksdGhpcy5SYi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nZCgiZ2xvYmFsIik7CiJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5iYygpfS5iaW5kKHRoaXMpLCEwKX07SC5wcm90b3R5cGUuVGI9ZnVuY3Rpb24oKXt0aGlzLmwobmV3IFBhKHRoaXMuQmErdGhpcy5QKCJjbGllbnQiLC0xIT10aGlzLkJhLmluZGV4T2YoIj8iKSkpLHRoaXMuYmMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2QoImNsaWVudCIpO3RoaXMuQWEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9O0gucHJvdG90eXBlLlA9ZnVuY3Rpb24oYSxjKXtjPSgodm9pZCAwPT09Yz8wOmMpPyImIjoiPyIpKygiY2FjaGU9IitsLnMoKSk7dGhpcy5pJiZ0aGlzLmkubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihjPSIiKTt0aGlzLmkmJnRoaXMuaS5ub0NhY2hlQnVzdGVyJiYoYz0iIik7cmV0dXJuIGN9O0gucHJvdG90eXBlLkFhPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLnFhKXt0aGlzLnFhPSEwO3ZhciBjPWZ1bmN0aW9uKGUpe2V8fAooZT13aW5kb3cpO2Zvcih2YXIgZj1lLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGg9MDtoPGYubGVuZ3RoO2grKyl7aWYoZltoXSYmZltoXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGZbaF0ucGF1c2UpdHJ5e2ZbaF0ucGF1c2UoKX1jYXRjaChtKXt9ZltoXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZbaF0pfWY9ZS5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGg9MDtoPGYubGVuZ3RoO2grKylmW2hdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZltoXSk7Zj1lLmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoaD0wO2g8Zi5sZW5ndGg7aCsrKWZbaF0mJmZbaF0ucGFyZW50Tm9kZSYmZltoXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZbaF0pO2Y9ZS5kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihoPTA7aDxmLmxlbmd0aDtoKyspZltoXSYmCmZbaF0ucGFyZW50Tm9kZSYmZltoXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZbaF0pO2lmKGUuc2VsZiE9ZS50b3ApZm9yKGU9ZS5kb2N1bWVudDtlLmhhc0NoaWxkTm9kZXMoKTspZS5yZW1vdmVDaGlsZChlLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWwuRyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMudGI9ZnVuY3Rpb24oKXt9KTsiZm9jdXMuZGUiPT1sLkcoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLnRiPWZ1bmN0aW9uKCl7fSk7aWYodGhpcy50YiYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnRiKXRoaXMudGIoKTtlbHNle2MoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoYyw1MDApO3RyeXtjKHdpbmRvdy50b3ApLHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe2Mod2luZG93LnRvcCl9LDUwMCl9Y2F0Y2goZSl7fX10aGlzLmI9dGhpcy55Yj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubSh0aGlzLldhKSk7dGhpcy5GKCk7bC5QKHYuVyk7CnZhciBkPWwuRyh0aGlzLmZhKCkpO2R8fChkPWwuRyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2wudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX07SC5wcm90b3R5cGUuUmI9ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYil7dmFyIGM9e307dHJ5e2M9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZil7Yy5lbmFibGVkPSJmYWxzZSJ9dmFyIGQ9ITE7dHJ5e3ZhciBlPWwuYyh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtlJiZlLmluZGV4T2YmJjA8PWUuaW5kZXhPZigidHZub3ciKSYmKGQ9ITApfWNhdGNoKGYpe31pZighKGR8fGMuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmYy5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2M9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYS5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe31nLnYuYz1jO3RoaXMuYT1sLm0oYy5lbmFibGVkKTt0aGlzLmI9CiF0aGlzLmE7dGhpcy5hPyJvYmplY3QiIT10eXBlb2YgdGhpcy5CYXx8dGhpcy5EfHx0aGlzLmZ8fHRoaXMuYmMoKToodGhpcy5KYT10aGlzLmE9ITEsdGhpcy5iPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMudSkpLHRoaXMuRigpKX19O0gucHJvdG90eXBlLmJjPWZ1bmN0aW9uKGEpe3ZhciBjPSExO2EmJihjPWEucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihjKXRyeXtkPUpTT04ucGFyc2UoYy50b1N0cmluZygpKX1jYXRjaChmKXtkPXRoaXMuQmF9ZWxzZSBkPXRoaXMuQmE7Yz0hMTt0cnl7dmFyIGU9bC5jKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2UmJmUuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCJ0dm5vdyIpJiYoYz0hMCl9Y2F0Y2goZil7fWU9ZnVuY3Rpb24oKXtmb3IodmFyIGY9MDtmPGQuc2VydmVyLmxlbmd0aDtmKyspe3ZhciBoPWQuc2VydmVyW2ZdO3RyeXtpZih2b2lkIDA9PT1ofHwhaC5yZXBsYWNlKCJbaGFzaF0iLGwuaWIoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKC9eKGh0dHBzPyk6XC9cLyhbdy4tXSopOj8uKihbMC05XSspP1wvKFthLWYwLTldezQwfSlcLz8kL2cpKXJldHVybiExfWNhdGNoKG0pe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTsKaWYoIShjfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZlKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fWcudi5jbGllbnQ9ZDt0aGlzLmE9bC5tKGQuZW5hYmxlZCk7dGhpcy5iPSF0aGlzLmE7dGhpcy5nPWQuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5nLmxlbmd0aDthKyspdGhpcy5nW2FdPXRoaXMuZ1thXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGwuYigid2ViLmRlIil8fGwuYigiZ214Lm5ldCIpfHxsLmIoImdteC5hdCIpfHxsLmIoImdteC5jaCIpfHxsLmIoIjF1bmQxLmRlIikpJiYhdGhpcy53YSgpKWZvcihhPTA7YTx0aGlzLmcubGVuZ3RoO2ErKyl0aGlzLmdbYV09CnRoaXMuZ1thXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLkViKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rYT1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5EPWQuY29uZmlnfHwiIjt0aGlzLmY9ZC5hbGlhc3x8bnVsbDt0aGlzLmpiPWQuYWRwYXRofHwiIjt0aGlzLkRhPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmcubGVuZ3RoKTt0aGlzLmEmJnRoaXMuRCYmdGhpcy5mJiZ0aGlzLmcubGVuZ3RoP3RoaXMuaWMoITEpOih0aGlzLkphPXRoaXMuYT0hMSx0aGlzLmI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm0odGhpcy51KSksdGhpcy5GKCkpfTtILnByb3RvdHlwZS5FYj1mdW5jdGlvbihhKXt0aGlzLmxhfHwodGhpcy5sYT1hfHwiIil9O0gucHJvdG90eXBlLmljPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLmIpe3ZhciBjPXt9O2lmKGEpe2M9bmV3IFBhKHRoaXMucygpKTt2YXIgZD1sLmModGhpcy5EKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KInMzaG9tYWRnbG9iYWxjb25maWdzIjtjLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yy5tZXRob2Q9IlBPU1QifWVsc2UgYz1uZXcgUGEodGhpcy5EK3RoaXMuUCgiY3VzdG9tZXIiKSk7dGhpcy5sKGMsdGhpcy5MYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nZCgiY3VzdG9tZXIiKTthP3RoaXMuUWQ/dGhpcy5BYSgibm9TVk1Db25maWciKToodGhpcy5RZD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuaWMoITApfS5iaW5kKHRoaXMpLCEwKX19O0gucHJvdG90eXBlLkxjPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLmIpe3ZhciBjPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShjLnRvU3RyaW5nKCkpfWNhdGNoKGYpe2lmKCF0aGlzLlcmJnRoaXMuYSl7dGhpcy5XPQohMDt0aGlzLmljKCEwKTtyZXR1cm59fWM9ITE7dHJ5e3ZhciBlPWwuYyh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtlJiZlLmluZGV4T2YmJjA8PWUuaW5kZXhPZigidHZub3ciKSYmKGM9ITApfWNhdGNoKGYpe31pZighKGN8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2EucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChmKXt9Zy52Lmk9ZDt0aGlzLnBiPWwubShkLnN0cmljdCk7dGhpcy5UYT1sLm0oZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuaWI9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLm89bC5tKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuYT1sLm0oZC5lbmFibGVkKTt0aGlzLkk9ZC50ZXN0aGlkZXx8IiI7dGhpcy5PPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuZ2E9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLlo9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMuUGE9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5CPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlU9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLm5hPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkFiPWQuanNwb3B1cHN8fCExO3RoaXMuYmE9ZC5zaWRlbG9hZHN8fCExO3RoaXMuaWE9ZC52cGFpZHx8ITE7dGhpcy5pLnZwYWlkPXRoaXMuaWE7dGhpcy5sYj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLlY9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLnFiPWQudm1hcHN8fCIiO3RoaXMuZGE9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLmJpdHJhdGU9ZC5iaXRyYXRlfHwxRTM7dGhpcy5FYihkLmFkX2ZhbGxiYWNrX1VSTHx8CiIiKTt0aGlzLmthPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLkdhPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307dGhpcy5rYj1kLnlpZWxkbGFifHxudWxsO3RoaXMuWT1kLnNhbmRib3hzY3JpcHRzfHxudWxsO2QuYWxpYXMmJih0aGlzLmY9ZC5hbGlhcyk7IXRoaXMuVyYmdGhpcy5hPyh0aGlzLlc9ITAsdGhpcy5pYyghMCkpOnRoaXMuYSYmIXRoaXMuUGMoKSYmKHRoaXMuSXx8dGhpcy5PfHx0aGlzLkt8fHRoaXMuZ2EpP3RoaXMuZGQ/KHRoaXMuSmE9dGhpcy5iPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMudSkpLHRoaXMuc2EoKSx0aGlzLkYoKSk6dGhpcy5OYygpOih0aGlzLmE9ITEsdGhpcy5GYSgpKX19O0gucHJvdG90eXBlLnRlPWZ1bmN0aW9uKGEpe3RoaXMuR2Q9ITA7dmFyIGM9ZnVuY3Rpb24oZCl7aWYoZD1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2QrIj0oW147XSspIikpKXJldHVybiBkWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCI7Yz10aGlzLmtiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoYykpO2M9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmMsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6bC5CKGMpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07bC5sYSh0aGlzLnMoKSwiUE9TVCIsYyxmdW5jdGlvbihkKXt0cnl7dmFyIGU9SlNPTi5wYXJzZShkLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7fWwudHJhY2soInN0YXRzX2hkX3lsX2RhdGEiLChlJiZlLmxlbmd0aCkudG9TdHJpbmcoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLmtiLnBhcmFtZXRlcil7dmFyIGY9dGhpcy5rYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIik7Zj1mLnNwbGl0KCJbc2l6ZV0iKS5qb2luKGVbMF0uYWRzaXplfHwwKTtmPWYuc3BsaXQoIltwcmljZV0iKS5qb2luKCh0aGlzLmtiLnByaWNlX211bHRpcGxpZXI/CmVbMF0ucHJpY2UqdGhpcy5rYi5wcmljZV9tdWx0aXBsaWVyOmVbMF0ucHJpY2UpfHwwKTt0aGlzLlBhKz1mfX1jYXRjaChoKXthKCl9YSgpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YSgpfS5iaW5kKHRoaXMpKX07SC5wcm90b3R5cGUuTmM9ZnVuY3Rpb24oKXt0aGlzLk1jKCk7dGhpcy5PYygpfTtILnByb3RvdHlwZS5PYz1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoTCl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitMKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrTCsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGM9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwplLndpZHRoPTE7ZS5oZWlnaHQ9MTtlLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Uuc3JjPSJhYm91dDpibGFuayI7dmFyIGY9bC5nKDEwKSxoPWwuZygxMCksbT1sLmcoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZixmdW5jdGlvbigpe2QrKztjPWMucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2M9Yy5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKG0sZnVuY3Rpb24oKXtkKys7Yz1jLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgRD1hdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKG0sImlubGluZSIpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGgsImV2YWwiKSsKYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2wuQihhKGYsImRhdGEiKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpO2UuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShEKX1jYXRjaChMKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlKX1jYXRjaChPKXt9aWYoMyE9ZCl7dmFyIEw9bC5GKCk7aWYoKEwudWJ8fEwudmIpJiYhTC5oYyYmIWwucmEoKSl7aWYodGhpcy5pJiZ0aGlzLmkucGxheWVyJiZ0aGlzLmkucGxheWVyLmxlbmd0aCl7bC50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYywhMCk7cmV0dXJufWwuYigidGVsZTUuZGUiKXx8bC5iKCJ0YWdlc3NwaWVnZWwuZGUiKXx8dGhpcy5BYSgiY3NwXyIrCmMpfWwudHJhY2soInN0YXRzX2hkX2NzcCIsYywhMCl9fS5iaW5kKHRoaXMpLDFFMyl9O0gucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7dGhpcy5iPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMudSkpO3RoaXMuRigpfTtILnByb3RvdHlwZS5BYz1mdW5jdGlvbihhKXt0aGlzLkc9ITA7dGhpcy5ifHwodGhpcy5iPXRoaXMuSmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm0oYSkpLHRoaXMuRigpLHRoaXMuc2EoKSl9O0gucHJvdG90eXBlLk1jPWZ1bmN0aW9uKCl7aWYodGhpcy5JKXt2YXIgYT1sLkYoKTtpZigoYS51Ynx8YS52YikmJnRoaXMuZ2IoKSl0aGlzLkFjKHRoaXMuSGIpO2Vsc2V7YT0hMTt0cnl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkkpO2Muc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5JKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7CmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYyk7dmFyIGQ9MD09PWMub2Zmc2V0V2lkdGh8fDA9PT1jLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGMpO2E9ZH1jYXRjaChlKXt9YT90aGlzLkFjKHRoaXMuSGIpOnRoaXMub2IoKX19ZWxzZSB0aGlzLm9iKCl9O0gucHJvdG90eXBlLmxkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtlPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsbC5zKCkpLHRoaXMuTGUoZSwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLmtkLmJpbmQodGhpcyksYy5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLmtkKCl9fWZ1bmN0aW9uIGMoKXt0aGlzLkFjKHRoaXMuSGIpfWlmKCh0aGlzLks9dGhpcy5nYSkmJnRoaXMuSy5sZW5ndGgpe3ZhciBkPXRoaXMuSy5zbGljZSgpLGU9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmtkKCl9O0gucHJvdG90eXBlLkxlPWZ1bmN0aW9uKGEsYyxkKXtmdW5jdGlvbiBlKCl7ZigpJiYKYygpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5sKG5ldyBQYShhKSxlLGZ1bmN0aW9uKCl7ZigpJiZkKCl9KX07SC5wcm90b3R5cGUub2I9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2U9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIixsLnMoKSksdGhpcy5NZShlLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMubGQuYmluZCh0aGlzKSxjLmJpbmQodGhpcykpfWNhdGNoKGYpe3RoaXMubGQoKX19ZnVuY3Rpb24gYygpe3RoaXMuQWModGhpcy5IYil9aWYodGhpcy5PJiZ0aGlzLk8ubGVuZ3RoKXt2YXIgZD10aGlzLk8uc2xpY2UoKSxlO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5sZCgpfTtILnByb3RvdHlwZS5NZT1mdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGYoKXtoKCkmJmQoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIG0/Cih3aW5kb3cuY2xlYXJUaW1lb3V0KG0pLCEwKTohMX1sLmcoKTt2YXIgbT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oTCxPKXtPPT1hJiZoKCkmJmYoKX07dmFyIEQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTtELnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO0Quc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7RC5vbmxvYWQ9ZTtELm9uZXJyb3I9ZjtELnNyYz1hO0QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGYpfWNhdGNoKEwpe2UoKX19O0gucHJvdG90eXBlLmtkPWZ1bmN0aW9uKCl7aWYodGhpcy5aKXRyeXtsLmxhKHRoaXMuWiwiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5hYT0hbC5tKGEuY2MpO3RoaXMuRmEoKX0uYmluZCh0aGlzKSx0aGlzLm5iLmJpbmQodGhpcykpfWNhdGNoKGEpe3RoaXMubmIoKX1lbHNlIHRoaXMuRmEoKX07CkgucHJvdG90eXBlLm5iPWZ1bmN0aW9uKCl7dGhpcy5iPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMudSkpO3RoaXMuRigpO3RoaXMuc2EoKX07SC5wcm90b3R5cGUuZ2I9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3sidGVzdGFkdGFnc3hociI6ImhlcmUgYmUgZHJhZ29ucyIsICJlbmFibGVkIjp0cnVlfScpLnRlc3RhZHRhZ3N4aHJ8fCFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJjb25maWciOiJoZXJlIGJlIGRyYWdvbnMifScpLmVuYWJsZWR8fCFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6ImhlcmUgYmUgZHJhZ29ucyJ9JykuZW5hYmxlZHx8ImZ1bmN0aW9uKCl7fSI9PT1DdXN0b21FdmVudC50b1N0cmluZygpfHwhMX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fTtILnByb3RvdHlwZS5GPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPSIwIixkPSIwIjt0cnl7bC5yYSgpJiYoYz0iMSIpfWNhdGNoKGUpe2M9CjJ9dGhpcy5HJiYoZD0iMSIpO2wudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYysiIitkLCEwKTtnLmouYigiZ2lnYS5kZSIpJiZ0aGlzLkcmJmwudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuZ2IoKSwhMCk7bC5GKCk7KHRoaXMuSmEmJnRoaXMuYXx8bC5hYSgpKSYmdGhpcy5ZJiZ0aGlzLkdiKCk7dGhpcy5aJiZsLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuYWEudG9TdHJpbmcoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm0odGhpcy5mYikpO3RoaXMuaGEmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5oYSYmdGhpcy5oYSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5hYX0pO2lmKHRoaXMuYSl0cnl7dGhpcy56YT1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2ZldGNoKGEuZWMrYS5QKCJnbG9iYWwiKSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5qc29uKCl9KS50aGVuKGZ1bmN0aW9uKGUpeyExPT09Zy5qLm0oZS5lbmFibGVkKT8KKGEuYT0hMSwhMD09PWcuai5tKGUubGVlcm95KSYmY2xlYXJJbnRlcnZhbChhLnphKSk6YS5hPSEwfSkuY2F0Y2goKTtmZXRjaChhLkQrYS5QKCJjdXN0b21lciIpKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBlLmpzb24oKX0pLnRoZW4oZnVuY3Rpb24oZSl7ITE9PT1nLmoubShlLmVuYWJsZWQpPyhhLmE9ITEsITA9PT1nLmoubShlLmxlZXJveSkmJmNsZWFySW50ZXJ2YWwoYS56YSkpOmEuYT0hMH0pLmNhdGNoKCl9LDNFNSl9Y2F0Y2goZSl7fX07SC5wcm90b3R5cGUuR2I9ZnVuY3Rpb24oKXt0aGlzLk49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5OLmlkPWwuZygxMCk7dGhpcy5OLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuTi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk4uY29udGVudFdpbmRvdyxjPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7dGhpcy5ZJiYoYy5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8CnRoaXMuWS5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5ZW2VdLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcykpO2Muc3JjPWwuSygiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpfS5iaW5kKHRoaXMpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5OKX07SC5wcm90b3R5cGUuTGI9ZnVuY3Rpb24oKXtpZih0aGlzLlRhJiZ0aGlzLlNiKCkpe3ZhciBhPXRoaXMuUWIoKTthJiZhLmpvaW4mJmwudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19O0gucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSxjLGQsZSxmLGgpe2U9dm9pZCAwPT09CmU/ITE6ZTtmPXZvaWQgMD09PWY/ITE6ZjtoPXZvaWQgMD09PWg/ITE6aDt0aGlzLmVhfHwodGhpcy5lYT0wKTt0aGlzLmVhKys7MUUzPHRoaXMuZWEmJiF0aGlzLnhiJiYodGhpcy54Yj0hMCxsLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLCgxRTMpLnRvU3RyaW5nKCksITApKTt2YXIgbT1hLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIik7YT1uZXcgZ2IoYSxjLGQsbnVsbCxtKTtlJiYoYS5GPSEwKTtmJiZsLnljKCkmJihhLmY9ITApO2gmJihhLmM9ITApO2lmKEQpe3ZhciBEPXBhcnNlSW50KEQsMTApOzA8RCYmKGEudGltZW91dD1EKX1yZXR1cm4gYS5sb2FkKCl9O0gucHJvdG90eXBlLkpiPWZ1bmN0aW9uKCl7dGhpcy5CYnx8KHRoaXMuQmI9ITAsbC5yYSgpfHxsLlYoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYz1udWxsLGQ9bnVsbCxlPSIiO3RyeXsoYz1hLnJlc3BvbnNlWE1MKXx8KGM9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChoKXt0aGlzLkFhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGVbMF0mJihlPWVbMF0pLGUpe2U9ZSYmZS5jaGlsZE5vZGVzJiZlLmNoaWxkTm9kZXNbMF0/ZS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLndhKCl8fChlPWwuYyhlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2E9ZnVuY3Rpb24oaCl7dmFyIG09IiI7dHJ5e2gmJmgudGFyZ2V0JiYKaC50YXJnZXQuZXJyb3ImJihtPWgudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKEQpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5BYSgibWVkaWFmaWxlX25vc291cmNlIittKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLkFhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoYyk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsZSk7Zi5sb2FkKCl9ZWxzZSB0aGlzLkFhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5BYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuQWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5BYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9O0gucHJvdG90eXBlLktiPWZ1bmN0aW9uKCl7dGhpcy5jKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLmMoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMubChhLHRoaXMuUWMuYmluZCh0aGlzKSx0aGlzLkNjLmJpbmQodGhpcykpfTtILnByb3RvdHlwZS5RYz1mdW5jdGlvbihhKXt2YXIgYz1udWxsLGQ9bnVsbDt0cnl7KGM9YS5yZXNwb25zZVhNTCl8fChjPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSwKZD1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3JldHVybn1kfHx0aGlzLlBiKCl9O0gucHJvdG90eXBlLkNjPWZ1bmN0aW9uKCl7fTtILnByb3RvdHlwZS5QYj1mdW5jdGlvbigpe2wuUCh2LlApO2wudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuQWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9O0gucHJvdG90eXBlLnNhPWZ1bmN0aW9uKCl7aWYodGhpcy5hJiZ0aGlzLmJhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuYmEubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5iYVthXTsicmVxdWVzdCI9PWMudHlwZSYmbC5WKGMudXJsLGMuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yy50eXBlKXt2YXIgZD1uZXcgQ2E7d2luZG93W2QuYSgpXT10aGlzO2wuVihjLnVybCxjLmFsaWFzLG51bGwsZnVuY3Rpb24oZSl7aWYoZS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoZS5yZXNwb25zZVRleHQpfWNhdGNoKGYpe319LApmdW5jdGlvbigpe30sdGhpcyl9fX07SC5wcm90b3R5cGUuUGM9ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5HYX07dmFyIHdhPXt9O3oucHJvdG90eXBlLk9iPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RoaXMuRWQ9ITB9d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixhLmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGEuYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGEuYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixhLmJpbmQodGhpcykpfTt6LnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dGhpcy5uYXx8KHRoaXMubmE9dGhpcy5nKDEwKSk7cmV0dXJuIHRoaXMubmF9O3oucHJvdG90eXBlLmxiPWZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXt2YXIgZj0obmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uKwpuYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuYXx8IngiKSkuc3BsaXQoIiAiKS5qb2luKCIiKSxoPU1hdGgubWF4KE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvNjApLE1hdGgucm91bmQoKERhdGUubm93KCkvMUUzKzEwKS82MCkpLnRvU3RyaW5nKCksbT1mLnNsaWNlKDAsZi5sZW5ndGgvMikuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTtmPWYuc2xpY2UoZi5sZW5ndGgvMikuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTtyZXR1cm4gaCttK2grZitofSgpLGM9ZnVuY3Rpb24oZil7dmFyIGg9MCxtO2lmKDA9PWYubGVuZ3RoKXJldHVybiBoO3ZhciBEPTA7Zm9yKG09Zi5sZW5ndGg7RDxtO0QrKyloPShoPDw1KS1oK2YuY2hhckNvZGVBdChEKSxofD0wO3JldHVybiBNYXRoLmFicyhoKX0oYSkudG9TdHJpbmcoKTtjPShjK2Muc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKSkuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKS5tYXRjaCgvLnsxLDJ9L2cpLm1hcChOdW1iZXIpOwphPWJ0b2EoYSkucmVwbGFjZSgvW15hLXpdL2dpLCIiKS5zdWJzdHIoMCwxMDApO2Zvcih2YXIgZD0iIixlPTA7ZTxjLmxlbmd0aDtlKyspZCs9YS5jaGFyQXQoY1tlXSk7cmV0dXJuIGR8fCJ6b3JrIn07ei5wcm90b3R5cGUuRGE9ZnVuY3Rpb24oKXt0aGlzLm9hfHwodGhpcy5vYT1NYXRoLnJhbmRvbSgpKTtyZXR1cm4gdGhpcy5vYX07ei5wcm90b3R5cGUuZ2E9ZnVuY3Rpb24oKXt0aGlzLmk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fTt6LnByb3RvdHlwZS5wb3N0TWVzc2FnZT1mdW5jdGlvbihhLGMpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYywKIioiKX07ei5wcm90b3R5cGUuZj1mdW5jdGlvbihhLGMsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YyxkYXRhOmR9KX07ei5wcm90b3R5cGUuUWI9ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuUGIoYS5kYXRhKX07ei5wcm90b3R5cGUuUGI9ZnVuY3Rpb24oYSl7aWYodGhpcy5pJiZ0aGlzLmkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGM9dGhpcy5pLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXRoaXMuaSYmdGhpcy5pLmV2ZW50bGlzdGVuZXImJnRoaXMuaS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmkuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX07ei5wcm90b3R5cGUuWj1mdW5jdGlvbihhLGMpe3RoaXMuaS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpjfSl9O3oucHJvdG90eXBlLldhPWZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRigpO3JldHVybiBnLnBjPyExOmcudi5iKCJ2cGFpZCIpJiYhYS5yYSYmKGEudWJ8fGEudmIpfTt6LnByb3RvdHlwZS5xYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmIoIm1hcnRoYXN0ZXdhcnQuY29tIil8fHRoaXMuYigiZmFuZG9tLmNvbSIpfHx0aGlzLmIoImdpZ2EuZGUiKXx8dGhpcy5iKCJraW5vLmRlIil8fHRoaXMuYigic3BpZWxldGlwcHMuZGUiKXx8dGhpcy5iKCJkZXNpcmVkLmRlIil9O3oucHJvdG90eXBlLkZiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GKCk7cmV0dXJuIGEudWJ8fGEudmJ8fGEuaGN8fGEueGN9O3oucHJvdG90eXBlLkdiPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYigic3BpZWdlbC5kZSIpfHx0aGlzLmIoIndlYi5kZSIpfHx0aGlzLmIoImdteC5uZXQiKX07ei5wcm90b3R5cGUuSWI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iKCJzcGllZ2VsLmRlIikmJiJwcmVyb2xsIj09PXRoaXMuVSYmLjM+dGhpcy5EYSgpfTt6LnByb3RvdHlwZS5NYj1mdW5jdGlvbigpe3ZhciBhPQpnLnYuYigidmVydGljYWxpenIiKXx8e307cmV0dXJuIHRoaXMucmEoKSYmZy5qLmIoInNwaWVnZWwuZGUiKSYmdGhpcy5EYSgpPChhLnRha2VvdmVyfHwuMTQpfHx0aGlzLkxiKCl9O3oucHJvdG90eXBlLk5iPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmEoKSYmLTEhPT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpfTt6LnByb3RvdHlwZS5MYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJhKCkmJi0xIT09d2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigidmVydGljYWxpenIiKSYmLTEhPT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCImZm9yY2UiKX07ei5wcm90b3R5cGUuTj1mdW5jdGlvbigpe2lmKGcucGMpcmV0dXJuITE7aWYoZy5VZClyZXR1cm4hMDt2YXIgYT1nLnYuYigidmVydGljYWxpenIiKXx8e307cmV0dXJuIGEmJmEuZW5hYmxlZCYmYS5sb2dvJiZ0aGlzLnJhKCl8fHRoaXMuTmIoKX07ei5wcm90b3R5cGUuVGE9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9CndpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIiZzdGFuZGFsb25lIil9O3oucHJvdG90eXBlLnNhPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB0aGlzLmwuZ2V0KCJmZXRjaCIpKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9hY3Rpdml0eSIse2NyZWRlbnRpYWxzOiJvbWl0In0pLnRoZW4oZnVuY3Rpb24oYSl7cmV0dXJuIDIwMCE9PWEuc3RhdHVzfHwiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvYWN0aXZpdHkiIT09YS51cmx9KS5jYXRjaChmdW5jdGlvbigpe3JldHVybiEwfSl9Y2F0Y2goYSl7cmV0dXJuITF9fTt6LnByb3RvdHlwZS55Yj1mdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5ib2R5KXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTthLndpZHRoPTE7YS5oZWlnaHQ9MTthLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsKdmFyIGM9YS5jb250ZW50V2luZG93fWVsc2UgYz13aW5kb3d9Y2F0Y2goTyl7Yz13aW5kb3d9dmFyIGQ9Yy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksZT1jLnNldFRpbWVvdXQuYmluZCh3aW5kb3cpLGY9Yy5kb2N1bWVudC5jcmVhdGVFbGVtZW50LmJpbmQoZG9jdW1lbnQpLGg9Yy5KU09OLG09Yy5KU09OLnBhcnNlLEQ9Yy5DdXN0b21FdmVudDt0cnl7dmFyIEw9Yy5mZXRjaC5iaW5kKHdpbmRvdyk7dGhpcy5sLnNldCgiZmV0Y2giLEwpfWNhdGNoKE8pe310aGlzLmwuc2V0KCJjcmVhdGVFbGVtZW50IixmKTt0aGlzLmwuc2V0KCJzZXRJbnRlcnZhbCIsZCk7dGhpcy5sLnNldCgic2V0VGltZW91dCIsZSk7dGhpcy5sLnNldCgiSlNPTiIsaCk7dGhpcy5sLnNldCgiSlNPTi5wYXJzZSIsbSk7dGhpcy5sLnNldCgiQ3VzdG9tRXZlbnQiLEQpO2RvY3VtZW50LmJvZHkmJmEmJmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSl9O3oucHJvdG90eXBlLmthPWZ1bmN0aW9uKGEpe3ZhciBjPQp0aGlzLGQsZTtyZXR1cm4gRmMoZnVuY3Rpb24oZil7cmV0dXJuIDE9PWYuYT8oZD1jLmlhKGEpLGU9e21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9LGJvZHk6ZGEuYSh7aG9tYWRfcmVzb2x2ZV9oYXNoOmR9KX0scWMoZixmZXRjaChhLGUpLnRoZW4oZnVuY3Rpb24oaCl7cmV0dXJuIGguanNvbigpfSkudGhlbihmdW5jdGlvbihoKXtyZXR1cm4gaC51cmx9KSwyKSk6Zi5yZXR1cm4oZi5iKX0pfTt6LnByb3RvdHlwZS5mYj1mdW5jdGlvbihhKXt2YXIgYyxkO3JldHVybiBGYyhmdW5jdGlvbihlKXtyZXR1cm4gMT09ZS5hPyhjPWcuSC5zKCksZD17bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn0sYm9keTpkYS5hKHtob21hZF91cmxfc3VmZml4OmEsaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoOiEwLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH0pfSwKcWMoZSxmZXRjaChjLGQpLnRoZW4oZnVuY3Rpb24oZil7cmV0dXJuIGYuanNvbigpfSkudGhlbihmdW5jdGlvbihmKXtyZXR1cm4gZy5ILmZhKCkucmVwbGFjZSgiW2hhc2hdIixmLmhhc2gpfSksMikpOmUucmV0dXJuKGUuYil9KX07ei5wcm90b3R5cGUuZGE9ZnVuY3Rpb24oYSxjKXtjPXZvaWQgMD09PWM/ITE6Yzt2YXIgZD10aGlzLGUsZjtyZXR1cm4gRmMoZnVuY3Rpb24oaCl7c3dpdGNoKGguYSl7Y2FzZSAxOmlmKCEoZC5BKGEpJiZkLldhKCkmJmQucWIoKSkpe2guYT0yO2JyZWFrfXJldHVybiBxYyhoLGQua2EoYSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gYX0pLDMpO2Nhc2UgMzplPWguYixkLkEoZSl8fDAhPT1lLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfHwoYz0hMCxhPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQoZSkrIiZ0eXBlPWpzIik7Y2FzZSAyOnJldHVybiBhPQpkYS5iKGEpLGY9ZC5vKGEsYyl8fCIiLGQuYmEmJihmPW5ldyBSZXF1ZXN0KGEpKSxxYyhoLGZldGNoKGYpLDQpO2Nhc2UgNDpyZXR1cm4gaC5yZXR1cm4oaC5iKX19KX07ei5wcm90b3R5cGUuQWI9ZnVuY3Rpb24oYSl7dGhpcy5iYT0hMTthJiZhLmluZGV4T2YmJjA8PWEuaW5kZXhPZigiaGRtYz10cnVlIikmJmcucGxheWVyJiZnLnBsYXllci5jYSYmIk9ubHlIT01BRCI9PWcucGxheWVyLmNhKCkmJiFnLkguRyYmKHRoaXMuYmE9ITAsZy5qLnRyYWNrKCJzdGF0c19oZF9ub2hvbWFkIiwiIiwhMCkpfTt6LnByb3RvdHlwZS5vPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1uZXcgZGEoZy5ILm1hKGEpKTtpZih0aGlzLkEoYSkpe3ZhciBmPWUuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTt2YXIgaD1hO2E9ZS5wYXRofWVsc2UgZj1jPyJ2cGFpZCI6Zy5ILnRhKGUuaG9zdCksaD1nLkgucygpLGE9Yz9hOmUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpOwphPWcuSC5DYihhKTtmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOmYsaG9tYWRfdXJsX3N1ZmZpeDphLGhvbWFkX3VybF9zdWZmaXhfYmFzZTY0OmJ0b2EoYS50b1N0cmluZygpKX07dGhpcy5XYSgpJiYoZi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSEwKTtmPU9iamVjdC5hc3NpZ24oe30sZixkKTtkPXttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifSxjcmVkZW50aWFsczoiaW5jbHVkZSIsYm9keTpkYS5hKGYpfTtyZXR1cm4gbmV3IFJlcXVlc3QoaCxkKX07ei5wcm90b3R5cGUuQmI9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5pYShhKSxkPSExO2lmKGMpcmV0dXJuIHRoaXMubGEoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpjfSxmdW5jdGlvbihlKXt0cnl7ZD1KU09OLnBhcnNlKGUucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goZil7fX0sZnVuY3Rpb24oKXt9LCEwKSxkfTt6LnByb3RvdHlwZS5pYT0KZnVuY3Rpb24oYSl7dmFyIGM9L14oaHR0cHM/KTpcL1wvKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspP1wvPyhbYS1mMC05XXs0MH0pXC8/JC9nO2lmKChjPWMuZXhlYyhhKSkmJihjWzJdfHxjWzVdKSl7aWYoY1syXSlyZXR1cm4gY1syXTtpZihjWzVdKXJldHVybiBjWzVdfWVsc2UgaWYoYz0vXihodHRwcz8pOlwvXC8oW3cuLV0qKTo/LiooWzAtOV0rKT9cLz8oW2EtZjAtOV17NDB9KVwvPyQvZywoYz1jLmV4ZWMoYSkpJiZjWzRdKXJldHVybiBjWzRdO3JldHVybiExfTt6LnByb3RvdHlwZS54Yj1mdW5jdGlvbihhLGMpe2lmKGMmJiEoMD50aGlzLmMoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yyl7aWYodGhpcy5FYihhKSlyZXR1cm47KGM9dGhpcy5CYihhKSl8fChjPWEpfTA9PT1jLmluZGV4T2YoIi8vIikmJihjPSJodHRwczoiK2MpO3RoaXMuaS51cmxzW2FdPWM7dGhpcy5pLnVybHNbY109YTt0aGlzLmkuaG9tYWRVcmxzW2FdPWM7dGhpcy5pLm9yaWdpbmFsVXJsc1tjXT0KYX19O3oucHJvdG90eXBlLkViPWZ1bmN0aW9uKGEpe3ZhciBjPSExO3RoaXMuaS5ob21hZFVybHNbYV0mJihjPXRoaXMuaS5ob21hZFVybHNbYV0pO3JldHVybiBjfTt6LnByb3RvdHlwZS50YT1mdW5jdGlvbihhKXt2YXIgYz0hMTt0aGlzLmkub3JpZ2luYWxVcmxzJiZ0aGlzLmkub3JpZ2luYWxVcmxzW2FdJiYoYz10aGlzLmkub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gY307ei5wcm90b3R5cGUuS2I9ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX07ei5wcm90b3R5cGUuemE9ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGM9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYysrO3JldHVybiBjfTt6LnByb3RvdHlwZS5UYj1mdW5jdGlvbihhLGMsZCl7YSYmKGEuc3R5bGVbY109ZCl9O3oucHJvdG90eXBlLnFhPWZ1bmN0aW9uKGEsYyl7Yz10aGlzLkNiKGMpOwpmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLlRiKGEsY1tkXS5rZXksY1tkXS52YWx1ZSl9O3oucHJvdG90eXBlLnpiPWZ1bmN0aW9uKGEpe2lmKCJzdHJpbmciIT09dHlwZW9mIGEpcmV0dXJuIiI7dHJ5e3JldHVybiBhLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Euc2xpY2UoMSl9Y2F0Y2goYyl7cmV0dXJuIiJ9fTt6LnByb3RvdHlwZS5DYj1mdW5jdGlvbihhKXthPWEuc3BsaXQoIjsiKTtmb3IodmFyIGM9W10sZCxlPSIiLGY9MDtmPGEubGVuZ3RoO2YrKyl7dmFyIGg9YVtmXS5zcGxpdCgiOiIpO2Q9aFswXS50cmltKCk7aFsxXSYmaFsxXS50cmltP2U9aFsxXS50cmltKCk6ZT0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoaD1kLnNwbGl0KCItIiksZD1oWzBdK3RoaXMuemIoaFsxXSkpO2Q9e2tleTpkLHZhbHVlOmV9O2MucHVzaChkKX1yZXR1cm4gY307ei5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oKXtmb3IodmFyIGE9IndlYi5kZSBwY2dhbWVzLmRlIHBjZ2FtZXNoYXJkd2FyZS5kZSB2aWRlb2dhbWVzem9uZS5kZSBnYW1lem9uZS5kZSBnYW1lc2FrdHVlbGwuZGUgYnVmZmVkLmRlIGdvbGVtLmRlIi5zcGxpdCgiICIpLApjPXRoaXMuRigpLGQ9MDtkPGEubGVuZ3RoO2QrKylpZih0aGlzLmIoYVtkXSkmJihjLnZifHxjLnljfHxjLnViKSlyZXR1cm4hMDtyZXR1cm4hMX07ei5wcm90b3R5cGUuVz1mdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfTt6LnByb3RvdHlwZS5GYT1mdW5jdGlvbihhLGMpe3ZhciBkPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBmPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWYpcmV0dXJuITE7dmFyIGg9Zi5oZWlnaHQqZi53aWR0aDthPWYud2lkdGg7dmFyIG09Zi5oZWlnaHQ7MD5mLnRvcCYmKG0rPWYudG9wKTtmLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCihtLT1mLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5mLmxlZnQmJihhKz1mLmxlZnQpO2YucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoYS09Zi5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+bSYmKG09MCk7MD5hJiYoYT0wKTswPGgmJihkPTEwMC9oKmEqbSk7ZD49YyYmKGU9ITApO3JldHVybiBlfTt6LnByb3RvdHlwZS5HYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLkZhKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihjKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdhKGEpfS5iaW5kKHRoaXMpLAoxMDApfTt6LnByb3RvdHlwZS5TYj1mdW5jdGlvbihhKXtmb3IoO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpfTt6LnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hLm1hdGNoKC9eKGh0dHBzPyk6XC9cLyhbYS1mMC05XXs0MH0pP1wuPyhbXHdcLlwtXSopXC4oZGFtb2h8aG9tYWQpXC4oW1x3XC5cLV0qKTo/KFswLTldKyk/XC8/KFthLWYwLTldezQwfSk/XC8/KChcP3wjKS4qKT8kLyl9O3oucHJvdG90eXBlLnM9ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX07ei5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXthPU1hdGgucm91bmQoTWF0aC5hYnMoYSkpfHwxMDtyZXR1cm4iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIuc3BsaXQoIiIpLnNvcnQoZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yYW5kb20oKS0KLjV9KS5qb2luKCIiKS5zdWJzdHIoMCxhKX07ei5wcm90b3R5cGUuaWI9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhyYil7dmFyIGliPSIiLHNiO2ZvcihzYj03OzA8PXNiO3NiLS0pe3ZhciBqYz1yYj4+PjQqc2ImMTU7aWIrPWpjLnRvU3RyaW5nKDE2KX1yZXR1cm4gaWJ9ZnVuY3Rpb24gZChyYixpYil7cmV0dXJuIHJiPDxpYnxyYj4+PjMyLWlifXZhciBlLGY9QXJyYXkoODApLGg9MTczMjU4NDE5MyxtPTQwMjMyMzM0MTcsRD0yNTYyMzgzMTAyLEw9MjcxNzMzODc4LE89MzI4NTM3NzUyMDt2YXIgTj1hLmxlbmd0aDt2YXIgbWE9W107Zm9yKGU9MDtlPE4tMztlKz00KXt2YXIga2E9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMyk7bWEucHVzaChrYSl9c3dpdGNoKE4lNCl7Y2FzZSAwOmU9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6ZT1hLmNoYXJDb2RlQXQoTi0xKTw8MjR8ODM4ODYwODticmVhazsKY2FzZSAyOmU9YS5jaGFyQ29kZUF0KE4tMik8PDI0fGEuY2hhckNvZGVBdChOLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6ZT1hLmNoYXJDb2RlQXQoTi0zKTw8MjR8YS5jaGFyQ29kZUF0KE4tMik8PDE2fGEuY2hhckNvZGVBdChOLTEpPDw4fDEyOH1mb3IobWEucHVzaChlKTsxNCE9bWEubGVuZ3RoJTE2OyltYS5wdXNoKDApO21hLnB1c2goTj4+PjI5KTttYS5wdXNoKE48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPG1hLmxlbmd0aDthKz0xNil7Zm9yKGU9MDsxNj5lO2UrKylmW2VdPW1hW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWZbZV09ZChmW2UtM11eZltlLThdXmZbZS0xNF1eZltlLTE2XSwxKTtrYT1oO049bTt2YXIgbmE9RDt2YXIgWT1MO3ZhciB4YT1PO2ZvcihlPTA7MTk+PWU7ZSsrKXt2YXIgWj1kKGthLDUpKyhOJm5hfH5OJlkpK3hhK2ZbZV0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1O3hhPVk7WT1uYTtuYT1kKE4sMzApO049a2E7a2E9Wn1mb3IoZT0yMDszOT49ZTtlKyspWj0KZChrYSw1KSsoTl5uYV5ZKSt4YStmW2VdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx4YT1ZLFk9bmEsbmE9ZChOLDMwKSxOPWthLGthPVo7Zm9yKGU9NDA7NTk+PWU7ZSsrKVo9ZChrYSw1KSsoTiZuYXxOJll8bmEmWSkreGErZltlXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUseGE9WSxZPW5hLG5hPWQoTiwzMCksTj1rYSxrYT1aO2ZvcihlPTYwOzc5Pj1lO2UrKylaPWQoa2EsNSkrKE5ebmFeWSkreGErZltlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUseGE9WSxZPW5hLG5hPWQoTiwzMCksTj1rYSxrYT1aO2g9aCtrYSY0Mjk0OTY3Mjk1O209bStOJjQyOTQ5NjcyOTU7RD1EK25hJjQyOTQ5NjcyOTU7TD1MK1kmNDI5NDk2NzI5NTtPPU8reGEmNDI5NDk2NzI5NX1aPWMoaCkrYyhtKStjKEQpK2MoTCkrYyhPKTtyZXR1cm4gWi50b0xvd2VyQ2FzZSgpfTt6LnByb3RvdHlwZS5CPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkLGUsZixoLG0sRCxMPTA7TDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoTCsrKSwKZT1hLmNoYXJDb2RlQXQoTCsrKSxmPWEuY2hhckNvZGVBdChMKyspLGg9ZD4+MixkPShkJjMpPDw0fGU+PjQsbT0oZSYxNSk8PDJ8Zj4+NixEPWYmNjMsaXNOYU4oZSk/bT1EPTY0OmlzTmFOKGYpJiYoRD02NCksYz1jKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KG0pKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KEQpO3JldHVybiBjfTt6LnByb3RvdHlwZS55Yz1mdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IuaGFzT3duUHJvcGVydHkoInZlbmRvciIpJiYKLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfTt6LnByb3RvdHlwZS5GPWZ1bmN0aW9uKCl7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxjPXt9O2MudmI9L0ZpcmVmb3hcL3xGeGlPU1wvLy50ZXN0KGEpJiYhL1NlYW1vbmtleVwvLy50ZXN0KGEpO2MueGM9L09QUlwvfE9wZXJhXC98T1BUXC8vLnRlc3QoYSk7Yy5qZT0vVHJpZGVudFwvNy4wO3w7IE1TSUUvLnRlc3QoYSk7Yy5oYz0vRWRnZVwvfEVkZ1wvfEVkZ2lPU1wvfEVkZ0FcLy8udGVzdChhKTtjLmxlPS9TYW1zdW5nQnJvd3NlclwvLy50ZXN0KGEpO2Mub2U9L1lhQnJvd3NlclwvfFlvd3NlclwvLy50ZXN0KGEpO2MubmU9L1VDQnJvd3NlclwvLy50ZXN0KGEpO2MuaGU9L0ZCQU58RkJBVi8udGVzdChhKTtjLmtlPS9JbnN0YWdyYW0vLnRlc3QoYSk7Yy5tZT0vVHdpdHRlci8udGVzdChhKTtjLmFkPWMubGV8fGMub2V8fGMubmV8fGMuaGV8fGMua2V8fGMubWU7Yy51Yj0vQ2hyb21lXC98Q3JpT1NcLy8udGVzdChhKSYmCiEvQ2hyb21pdW1cLy8udGVzdChhKSYmIWMueGMmJiFjLmhjJiYhYy5hZDtjLnljPS9TYWZhcmlcLy8udGVzdChhKSYmIWMudmImJiFjLnViJiYhYy54YyYmIWMuaGMmJiFjLmFkO2MucmE9L2lQaG9uZXxpUGFkfGlQb2R8QW5kcm9pZHxCbGFja0JlcnJ5fFBsYXlCb29rfE1vYmlsZXxPcGVyYSBNaW5pfElFTW9iaWxlfEZ4aU9TfENyaU9TfEVkZ2lPUy8udGVzdChhKTtjLnJmPSFjLnZiJiYhYy54YyYmIWMuamUmJiFjLmhjJiYhYy51YiYmIWMueWMmJiFjLmFkO2MucWY9L2JvdHxiaW5nYm90fGdvb2dsZWJvdHxjcmF3bGVyfHNwaWRlcnxyb2JvdHxjcmF3bGluZy8udGVzdChhKTt0cnl7Yy5pZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5ifHwvSGVhZGxlc3NDaHJvbWVcLy8udGVzdChhKX1jYXRjaChkKXtjLmllPSExfXJldHVybiBjfTt6LnByb3RvdHlwZS5yYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLkYoKS5yYX07CnoucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGM9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxlPTE0O2UtLTspZFtjW2VdXT1hW2VdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbY1sxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGYsaCxtKXtoJiYoZC5xdWVyeUtleVtoXT1tKX0pO3JldHVybiBkfTt6LnByb3RvdHlwZS51bmlxdWU9CmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz17fSxkPVtdLGU9MCxmPWEubGVuZ3RoO2U8ZjsrK2UpYy5oYXNPd25Qcm9wZXJ0eShhW2VdKXx8KGQucHVzaChhW2VdKSxjW2FbZV1dPTEpO3JldHVybiBkfTt6LnByb3RvdHlwZS5HPWZ1bmN0aW9uKGEpe2E9dGhpcy5jKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYz0iIjthW2EubGVuZ3RoLTJdJiYoYys9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihjKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gY307ei5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXt2YXIgYz0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihjPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YyYmLTE8Yy5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9O3oucHJvdG90eXBlLm5iPWZ1bmN0aW9uKCl7dmFyIGE9IiIsYz0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxjPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYz13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChkKXt9cmV0dXJuIGErY307ei5wcm90b3R5cGUuRGI9ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGQ9W10sZT1bXSxmPTA7ZjxjLmxlbmd0aDtmKyspZFtjW2ZdXT0hMDtmb3IoZj0wO2Y8YS5sZW5ndGg7ZisrKWRbYVtmXV18fGUucHVzaChhW2ZdKTtyZXR1cm4gZX07ei5wcm90b3R5cGUuZ2I9ZnVuY3Rpb24oYSxjKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGM/KChlPWEuc3BsaXQoIiUiKSkmJihlPWVbMF0pLGQ9TWF0aC5yb3VuZChjLzEwMCplKSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChmKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfTt6LnByb3RvdHlwZS5ZYj1mdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmdiKGEsYyl9Owp6LnByb3RvdHlwZS53YT1mdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGM9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGM9TWF0aC5mbG9vcihhLzYwKSxjPXRoaXMuamIoYykrIjoiK3RoaXMuamIoTWF0aC5mbG9vcihhLTYwKmMpKSk7cmV0dXJuIGN9O3oucHJvdG90eXBlLmpiPWZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfTt6LnByb3RvdHlwZS5wYT1mdW5jdGlvbihhKXt0aGlzLlU9YX07ei5wcm90b3R5cGUuaGE9ZnVuY3Rpb24oYSxjLGQpe2Quc3RhdGU9dGhpcy5VO3RoaXMuZWEoZCk7dHJ5e2lmKCJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50KXZhciBlPW5ldyBDdXN0b21FdmVudChjLHtkZXRhaWw6ZH0pO2Vsc2UgZT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxlLmluaXRDdXN0b21FdmVudChjLCExLCExLGQpO2EuZGlzcGF0Y2hFdmVudChlKX1jYXRjaChmKXt0aGlzLmhiPQohMCxkb2N1bWVudC5ib2R5PyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGEud2lkdGg9MSxhLmhlaWdodD0xLGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKSxhPWEuY29udGVudFdpbmRvdyk6YT13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PWEuQ3VzdG9tRXZlbnQuYmluZCh3aW5kb3cpfX07ei5wcm90b3R5cGUuUD1mdW5jdGlvbihhKXt2YXIgYyxkO2N8fChjPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTtpZihhJiYxMDA1PT1hLmNvZGUmJih0aGlzLmIoImZvY3VzIil8fHRoaXMuYigiZ2lnYSIpKSl7dmFyIGU9Il8iK2EuaG9tYWRJbXByZXNzaW9uQWRJZDt0aGlzLkl8fCh0aGlzLkk9e2hvbWFkSW1wcmVzc2lvbkFkSWRzOnt9fSk7dGhpcy5JLmhvbWFkSW1wcmVzc2lvbkFkSWRzW2VdP3RoaXMuSS5ob21hZEltcHJlc3Npb25BZElkc1tlXSsrOnRoaXMuSS5ob21hZEltcHJlc3Npb25BZElkc1tlXT0xO3RoaXMudHJhY2soInN0YXRzX3RtcF9hZHN0YXJ0IiwKdGhpcy5JLmhvbWFkSW1wcmVzc2lvbkFkSWRzW2VdLCEwKX10aGlzLmhhKGQsYyxhKTtnJiZnLnBsYXllciYmZy5wbGF5ZXIuJGQmJmcucGxheWVyLiRkKGEubmFtZSxhKX07ei5wcm90b3R5cGUuYT1mdW5jdGlvbihhLGMsZCxlLGYsaCl7dmFyIG09YTtkJiZjJiYoYz12LmEoYyxkKSk7YyYmKG09di5hKGEsYykpO2UmJihtPXYuYShtLGUpKTtmJiYobT12LmEobSxmKSk7aCYmKG09di5hKG0saCkpO3RoaXMuUChtKX07ei5wcm90b3R5cGUuUmI9ZnVuY3Rpb24oYSl7dmFyIGM9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2t8fGEuY29ycm9ib3JhdGVfdHJhY2spYz1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXt2YyYmKGMuc2Vzc2lvbl9pZD12Yyk7Yy5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmCihjLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yy5ldmVudD1hLmNvZGU7Yy5zaXRlX2hyZWY9dGhpcy5uYigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmMucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpjLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmMucG9zaXRpb249MzticmVhaztkZWZhdWx0OmMucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYy52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKTthLmR1cmF0aW9uJiYoYy5hZF9kdXJhdGlvbj1hLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGN9O3oucHJvdG90eXBlLlpiPWZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5EKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5lYShhKX07CnoucHJvdG90eXBlLmVhPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuUmIoYSk7aWYoYylpZihnLkgmJmcuSC5iKXtpZihnLkguYSl7aWYoIm9iamVjdCI9PXR5cGVvZiBjKXRyeXtjPUpTT04uc3RyaW5naWZ5KGMpfWNhdGNoKGQpe2M9Yy50b1N0cmluZz9jLnRvU3RyaW5nKCk6IiJ9YyYmYy50cmltJiYoYz1jLnRyaW0oKSk7YT1nLkgucygpO2hiKGcuSC5jKGEsITApLCJ0cmFja2luZyIpO2E9Zy5ILmMoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWM7Zy5ILmwoYSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9KX19ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoYyl9LmJpbmQodGhpcyksNTAwKX07ei5wcm90b3R5cGUudHJhY2s9ZnVuY3Rpb24oYSxjLGQpe2lmKGQ9dm9pZCAwPT09ZD8hMTpkKWlmKGcuSCYmZy5ILmIpe2lmKGcuSC5hKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtjJiZjLnRyaW0mJihjPQpjLnRyaW0oKSk7dmFyIGU9Zy5ILnMoKTtoYihnLkguYyhlLCEwKSwidHJhY2tpbmciKTtlPWcuSC5jKGUsITApO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2UuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ZS5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYysiIikrIioiO2cuSC5sKGUsZnVuY3Rpb24oZil7dmFyIGg9ITE7Zj1mLnJlc3BvbnNlVGV4dDt0cnl7Zj1KU09OLnBhcnNlKGYpLGY9Zi5kYXRhLGZbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGg9ITApLGZbMV0mJmZbMV0hPWVuY29kZVVSSUNvbXBvbmVudChjKyIiKSYmKGg9ITEpfWNhdGNoKG0pe31ofHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZlswXT9mWzBdOiIiKSsoZlsxXT9mWzFdOiIiKSwhMCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9KX19ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYyxkKX0uYmluZCh0aGlzKSw1MDApfTt6LnByb3RvdHlwZS5ZPWZ1bmN0aW9uKGEpe2lmKCFnfHwhZy5ILmIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlkoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGcuSC5hKXt2YXIgYz1hLmpvaW4oIiwiKSxkPWcuSC5zKCk7ZD1nLkguYyhkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YztnLkgubChkLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30pfX07ei5wcm90b3R5cGUubWE9ZnVuY3Rpb24oKXtnLkgmJmcuSC5iP2cuSC5hJiZnLkguS2IoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoKX0uYmluZCh0aGlzKSw1MDApfTt6LnByb3RvdHlwZS5wYj1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn07ei5wcm90b3R5cGUuQWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vYihhKToiIn07ei5wcm90b3R5cGUub2I9CmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGIoYSk7YyYmKGM9Yy50cmltKCkpOyFjJiZhLnRleHRDb250ZW50JiYoYz1hLnRleHRDb250ZW50LGM9Yy50cmltKCkpO3JldHVybiBjfTt6LnByb3RvdHlwZS5LPWZ1bmN0aW9uKGEsYyxkLGUpe2Q9dm9pZCAwPT09ZD8hMTpkO2U9dm9pZCAwPT09ZT97fTplO2lmKHRoaXMuQShhKXx8dGhpcy5LYihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7aWYod2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmZkJiZ3aW5kb3cuc2FuZGJveC5mZFsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0pe3ZhciBmPXdpbmRvdy5zYW5kYm94OzA8PWYuZmRbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fGYuZmRbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIil9aWYodGhpcy50YShhKSlyZXR1cm4gdGhpcy50YShhKTtmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9OwpmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2UmJmUucG9zdCYmKGZbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGYuaG9tYWRfdnBhaWRfc2NyaXB0aW5qZWN0PUpTT04uc3RyaW5naWZ5KHtoZWFkOiJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIn0pLGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZSYmZS5vbmx5VVJMJiYoZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGg9ITE7ZD0hMTtkPXRoaXMuYyhhKTtkPXRoaXMuVihhLGMudGEoZC5ob3N0KSxmLGZ1bmN0aW9uKG0pe2g9bS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSwKYywhMCk7dHJ5e2h8fChoPWQpLGg9SlNPTi5wYXJzZShoLnRvU3RyaW5nKCkpfWNhdGNoKG0pe2g9ITF9aC51cmwmJmguaGFzaCYmKGg9Yy5mYSgpLnJlcGxhY2UoIltoYXNoXSIsaC5oYXNoKSk7dGhpcy54YihoLGEpO3JldHVybiBofTt6LnByb3RvdHlwZS5WPWZ1bmN0aW9uKGEsYyxkLGUsZixoLG0sRCl7bT12b2lkIDA9PT1tPyExOm07RD12b2lkIDA9PT1EPyExOkQ7dmFyIEw9aHx8Zy5IO2g9ITA7RCYmKGg9ITEpO2lmKEwmJkwuYilpZihMLmEpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChOKXtmKE4pfWlmKCJzdHJpbmciIT10eXBlb2YgYSlmKCk7ZWxzZXtoYihMLmMoYSxoKSwibG9hZFJlc291cmNlVGhyb3VnaEhvbWFkIik7aD1MLmMoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1jO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgTyBpbiBkKWguZGF0YVtPXT1kW09dO3JldHVybiBMLmwoaCxlLGYsITEsCiExLG0pfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WKGEsYyxkLGUsZixMLG0sRCl9LmJpbmQodGhpcyksNTAwKX07ei5wcm90b3R5cGUubGE9ZnVuY3Rpb24oYSxjLGQsZSxmLGgpe3ZhciBtPSEwO209dm9pZCAwPT09bT8hMTptO3ZhciBEPSEwOyh2b2lkIDA9PT1oPzA6aCkmJihEPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgTCBpbiBoKWQrPSImIitMKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFtMXSk7ZD1kLnN1YnN0cigxKX12YXIgTz1uZXcgWE1MSHR0cFJlcXVlc3Q7Ty5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZXx8NCE9Ty5yZWFkeVN0YXRlfHwyMDAhPU8uc3RhdHVzJiYyMDEhPU8uc3RhdHVzfHxlKE8pO2YmJjQ9PU8ucmVhZHlTdGF0ZSYmMjAwIT1PLnN0YXR1cyYmMjAxIT1PLnN0YXR1cyYmZihPKX07dHJ5e08ub3BlbihjLGEsRCksTy53aXRoQ3JlZGVudGlhbHM9bSwwPGQubGVuZ3RoJiYKTy5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxPLnNlbmQoZCl9Y2F0Y2goTil7ZiYmZigpfX07ei5wcm90b3R5cGUuSmI9ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMTtpZihjKWZvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKWlmKGNbZV09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9O3oucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX07dmFyIGw9bmV3IHo7Zy5qPWw7Zy5qLk9iKCk7dmFyIERhPWw7di5wcm90b3R5cGUuZ2V0RXJyb3JDb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIiJ9O3YucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfTt2LmE9ZnVuY3Rpb24oYSxjKXt2YXIgZD17fSxlO2ZvcihlIGluIGMpZFtlXT1jW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTt2Llc9e2NvZGU6IjEwMDAiLAp0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTt2Lmk9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O3YuZ2E9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07di5PPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O3YuaWE9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07di5CPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTt2Lmw9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTt2LkY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O3YuRD17Y29kZToiMTAwOCIsCnR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTt2LmY9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O3YubT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTt2LmRhPXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07di5VPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTt2LlA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTt2LmhhPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTt2Lk49e2NvZGU6IjEwMTUiLAp0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O3YuSz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O3YuZz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTt2LmI9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTt2LmM9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTt2LnU9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTt2LnM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTt2LkE9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkUGF1c2UifTt2Lkc9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTt2Lm89e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTt2LmVhPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O3YuVj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTt2LlhhPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTt2LiRhPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07di5JPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07di5mYT17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CnYuYmE9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTt2Llo9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTt2Llk9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07di5hYT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07KGZ1bmN0aW9uKGEsYyl7Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPT10eXBlb2YgbW9kdWxlP2MoZXhwb3J0cyk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5wZj9kZWZpbmUoWyJleHBvcnRzIl0sYyk6YyhhLmpmPXt9KX0pKHRoaXMsZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhwKXsic3RyaW5nIiE9PQp0eXBlb2YgcCYmKHA9U3RyaW5nKHApKTtpZigvW15hLXowLTlcLSMkJSYnKisuXl9gfH5dL2kudGVzdChwKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZSIpO3JldHVybiBwLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gZChwKXsic3RyaW5nIiE9PXR5cGVvZiBwJiYocD1TdHJpbmcocCkpO3JldHVybiBwfWZ1bmN0aW9uIGUocCl7dmFyIEI9e25leHQ6ZnVuY3Rpb24oKXt2YXIgSj1wLnNoaWZ0KCk7cmV0dXJue2RvbmU6dm9pZCAwPT09Six2YWx1ZTpKfX19O1ouQ2QmJihVYSgpLHViKCksQltTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIEJ9KTtyZXR1cm4gQn1mdW5jdGlvbiBmKHApe3RoaXMubWFwPXt9O3AgaW5zdGFuY2VvZiBmP3AuZm9yRWFjaChmdW5jdGlvbihCLEope3RoaXMuYXBwZW5kKEosQil9LHRoaXMpOkFycmF5LmlzQXJyYXkocCk/cC5mb3JFYWNoKGZ1bmN0aW9uKEIpe3RoaXMuYXBwZW5kKEJbMF0sCkJbMV0pfSx0aGlzKTpwJiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3RoaXMuYXBwZW5kKEIscFtCXSl9LHRoaXMpfWZ1bmN0aW9uIGgocCl7aWYocC5ib2R5VXNlZClyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcigiQWxyZWFkeSByZWFkIikpO3AuYm9keVVzZWQ9ITB9ZnVuY3Rpb24gbShwKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oQixKKXtwLm9ubG9hZD1mdW5jdGlvbigpe0IocC5yZXN1bHQpfTtwLm9uZXJyb3I9ZnVuY3Rpb24oKXtKKHAuZXJyb3IpfX0pfWZ1bmN0aW9uIEQocCl7dmFyIEI9bmV3IEZpbGVSZWFkZXIsSj1tKEIpO0IucmVhZEFzQXJyYXlCdWZmZXIocCk7cmV0dXJuIEp9ZnVuY3Rpb24gTChwKXtwPW5ldyBVaW50OEFycmF5KHApO2Zvcih2YXIgQj1BcnJheShwLmxlbmd0aCksSj0wO0o8cC5sZW5ndGg7SisrKUJbSl09U3RyaW5nLmZyb21DaGFyQ29kZShwW0pdKTtyZXR1cm4gQi5qb2luKCIiKX0KZnVuY3Rpb24gTyhwKXtpZihwLnNsaWNlKXJldHVybiBwLnNsaWNlKDApO3ZhciBCPW5ldyBVaW50OEFycmF5KHAuYnl0ZUxlbmd0aCk7Qi5zZXQobmV3IFVpbnQ4QXJyYXkocCkpO3JldHVybiBCLmJ1ZmZlcn1mdW5jdGlvbiBOKCl7dGhpcy5ib2R5VXNlZD0hMTt0aGlzLnJkPWZ1bmN0aW9uKHApeyh0aGlzLiRiPXApPyJzdHJpbmciPT09dHlwZW9mIHA/dGhpcy5hYz1wOlouYmxvYiYmQmxvYi5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihwKT90aGlzLnJiPXA6Wi5mb3JtRGF0YSYmRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YocCk/dGhpcy5xZD1wOlouc2VhcmNoUGFyYW1zJiZVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YocCk/dGhpcy5hYz1wLnRvU3RyaW5nKCk6Wi5hcnJheUJ1ZmZlciYmWi5ibG9iJiZwJiZEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihwKT8odGhpcy5iYj1PKHAuYnVmZmVyKSx0aGlzLiRiPW5ldyBCbG9iKFt0aGlzLmJiXSkpOgpaLmFycmF5QnVmZmVyJiYoQXJyYXlCdWZmZXIucHJvdG90eXBlLmlzUHJvdG90eXBlT2YocCl8fGliKHApKT90aGlzLmJiPU8ocCk6dGhpcy5hYz1wPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwKTp0aGlzLmFjPSIiO3RoaXMuaGVhZGVycy5nZXQoImNvbnRlbnQtdHlwZSIpfHwoInN0cmluZyI9PT10eXBlb2YgcD90aGlzLmhlYWRlcnMuc2V0KCJjb250ZW50LXR5cGUiLCJ0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgiKTp0aGlzLnJiJiZ0aGlzLnJiLnR5cGU/dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC10eXBlIix0aGlzLnJiLnR5cGUpOlouc2VhcmNoUGFyYW1zJiZVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YocCkmJnRoaXMuaGVhZGVycy5zZXQoImNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04IikpfTtaLmJsb2ImJih0aGlzLmJsb2I9ZnVuY3Rpb24oKXt2YXIgcD1oKHRoaXMpOwppZihwKXJldHVybiBwO2lmKHRoaXMucmIpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnJiKTtpZih0aGlzLmJiKXJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuYmJdKSk7aWYodGhpcy5xZCl0aHJvdyBFcnJvcigiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iIik7cmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5hY10pKX0sdGhpcy5hcnJheUJ1ZmZlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJiP2godGhpcyl8fFByb21pc2UucmVzb2x2ZSh0aGlzLmJiKTp0aGlzLmJsb2IoKS50aGVuKEQpfSk7dGhpcy50ZXh0PWZ1bmN0aW9uKCl7dmFyIHA9aCh0aGlzKTtpZihwKXJldHVybiBwO2lmKHRoaXMucmIpe3A9dGhpcy5yYjt2YXIgQj1uZXcgRmlsZVJlYWRlcixKPW0oQik7Qi5yZWFkQXNUZXh0KHApO3JldHVybiBKfWlmKHRoaXMuYmIpcmV0dXJuIFByb21pc2UucmVzb2x2ZShMKHRoaXMuYmIpKTtpZih0aGlzLnFkKXRocm93IEVycm9yKCJjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIHRleHQiKTsKcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmFjKX07Wi5mb3JtRGF0YSYmKHRoaXMuZm9ybURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbihrYSl9KTt0aGlzLmpzb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKX07cmV0dXJuIHRoaXN9ZnVuY3Rpb24gbWEocCxCKXtCPUJ8fHt9O3ZhciBKPUIuYm9keTtpZihwIGluc3RhbmNlb2YgbWEpe2lmKHAuYm9keVVzZWQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQWxyZWFkeSByZWFkIik7dGhpcy51cmw9cC51cmw7dGhpcy5jcmVkZW50aWFscz1wLmNyZWRlbnRpYWxzO0IuaGVhZGVyc3x8KHRoaXMuaGVhZGVycz1uZXcgZihwLmhlYWRlcnMpKTt0aGlzLm1ldGhvZD1wLm1ldGhvZDt0aGlzLm1vZGU9cC5tb2RlO3RoaXMuc2lnbmFsPXAuc2lnbmFsO0p8fG51bGw9PXAuJGJ8fChKPXAuJGIscC5ib2R5VXNlZD0hMCl9ZWxzZSB0aGlzLnVybD1TdHJpbmcocCk7dGhpcy5jcmVkZW50aWFscz0KQi5jcmVkZW50aWFsc3x8dGhpcy5jcmVkZW50aWFsc3x8InNhbWUtb3JpZ2luIjtpZihCLmhlYWRlcnN8fCF0aGlzLmhlYWRlcnMpdGhpcy5oZWFkZXJzPW5ldyBmKEIuaGVhZGVycyk7cD1CLm1ldGhvZHx8dGhpcy5tZXRob2R8fCJHRVQiO3ZhciBwYT1wLnRvVXBwZXJDYXNlKCk7dGhpcy5tZXRob2Q9LTE8c2IuaW5kZXhPZihwYSk/cGE6cDt0aGlzLm1vZGU9Qi5tb2RlfHx0aGlzLm1vZGV8fG51bGw7dGhpcy5zaWduYWw9Qi5zaWduYWx8fHRoaXMuc2lnbmFsO3RoaXMucmVmZXJyZXI9bnVsbDtpZigoIkdFVCI9PT10aGlzLm1ldGhvZHx8IkhFQUQiPT09dGhpcy5tZXRob2QpJiZKKXRocm93IG5ldyBUeXBlRXJyb3IoIkJvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzIik7dGhpcy5yZChKKX1mdW5jdGlvbiBrYShwKXt2YXIgQj1uZXcgRm9ybURhdGE7cC50cmltKCkuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKEope2lmKEope3ZhciBwYT1KLnNwbGl0KCI9Iik7Cko9cGEuc2hpZnQoKS5yZXBsYWNlKC9cKy9nLCIgIik7cGE9cGEuam9pbigiPSIpLnJlcGxhY2UoL1wrL2csIiAiKTtCLmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQoSiksZGVjb2RlVVJJQ29tcG9uZW50KHBhKSl9fSk7cmV0dXJuIEJ9ZnVuY3Rpb24gbmEocCl7dmFyIEI9bmV3IGY7cC5yZXBsYWNlKC9ccj9cbltcdCBdKy9nLCIgIikuc3BsaXQoL1xyP1xuLykuZm9yRWFjaChmdW5jdGlvbihKKXtKPUouc3BsaXQoIjoiKTt2YXIgcGE9Si5zaGlmdCgpLnRyaW0oKTtwYSYmQi5hcHBlbmQocGEsSi5qb2luKCI6IikudHJpbSgpKX0pO3JldHVybiBCfWZ1bmN0aW9uIFkocCxCKXtCfHwoQj17fSk7dGhpcy50eXBlPSJkZWZhdWx0Ijt0aGlzLnN0YXR1cz12b2lkIDA9PT1CLnN0YXR1cz8yMDA6Qi5zdGF0dXM7dGhpcy5vaz0yMDA8PXRoaXMuc3RhdHVzJiYzMDA+dGhpcy5zdGF0dXM7dGhpcy5zdGF0dXNUZXh0PSJzdGF0dXNUZXh0ImluIEI/Qi5zdGF0dXNUZXh0OiJPSyI7dGhpcy5oZWFkZXJzPQpuZXcgZihCLmhlYWRlcnMpO3RoaXMudXJsPUIudXJsfHwiIjt0aGlzLnJkKHApfWZ1bmN0aW9uIHhhKHAsQil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKEoscGEpe2Z1bmN0aW9uIHdjKCl7YWEuYWJvcnQoKX12YXIgRWE9bmV3IG1hKHAsQik7aWYoRWEuc2lnbmFsJiZFYS5zaWduYWwuYWJvcnRlZClyZXR1cm4gcGEobmV3IGEuRE9NRXhjZXB0aW9uKCJBYm9ydGVkIiwiQWJvcnRFcnJvciIpKTt2YXIgYWE9bmV3IFhNTEh0dHBSZXF1ZXN0O2FhLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBEYj17c3RhdHVzOmFhLnN0YXR1cyxzdGF0dXNUZXh0OmFhLnN0YXR1c1RleHQsaGVhZGVyczpuYShhYS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKXx8IiIpfTtEYi51cmw9InJlc3BvbnNlVVJMImluIGFhP2FhLnJlc3BvbnNlVVJMOkRiLmhlYWRlcnMuZ2V0KCJYLVJlcXVlc3QtVVJMIik7SihuZXcgWSgicmVzcG9uc2UiaW4gYWE/YWEucmVzcG9uc2U6YWEucmVzcG9uc2VUZXh0LERiKSl9O2FhLm9uZXJyb3I9CmZ1bmN0aW9uKCl7cGEobmV3IFR5cGVFcnJvcigiTmV0d29yayByZXF1ZXN0IGZhaWxlZCIpKX07YWEub250aW1lb3V0PWZ1bmN0aW9uKCl7cGEobmV3IFR5cGVFcnJvcigiTmV0d29yayByZXF1ZXN0IGZhaWxlZCIpKX07YWEub25hYm9ydD1mdW5jdGlvbigpe3BhKG5ldyBhLkRPTUV4Y2VwdGlvbigiQWJvcnRlZCIsIkFib3J0RXJyb3IiKSl9O2FhLm9wZW4oRWEubWV0aG9kLEVhLnVybCwhMCk7ImluY2x1ZGUiPT09RWEuY3JlZGVudGlhbHM/YWEud2l0aENyZWRlbnRpYWxzPSEwOiJvbWl0Ij09PUVhLmNyZWRlbnRpYWxzJiYoYWEud2l0aENyZWRlbnRpYWxzPSExKTsicmVzcG9uc2VUeXBlImluIGFhJiZaLmJsb2ImJihhYS5yZXNwb25zZVR5cGU9ImJsb2IiKTtFYS5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24oRGIsS2Mpe2FhLnNldFJlcXVlc3RIZWFkZXIoS2MsRGIpfSk7RWEuc2lnbmFsJiYoRWEuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0Iix3YyksYWEub25yZWFkeXN0YXRlY2hhbmdlPQpmdW5jdGlvbigpezQ9PT1hYS5yZWFkeVN0YXRlJiZFYS5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHdjKX0pO2FhLnNlbmQoInVuZGVmaW5lZCI9PT10eXBlb2YgRWEuJGI/bnVsbDpFYS4kYil9KX1VYSgpO3ZhciBaPXtzZWFyY2hQYXJhbXM6IlVSTFNlYXJjaFBhcmFtcyJpbiBzZWxmLENkOiJTeW1ib2wiaW4gc2VsZiYmIml0ZXJhdG9yImluIFN5bWJvbCxibG9iOiJGaWxlUmVhZGVyImluIHNlbGYmJiJCbG9iImluIHNlbGYmJiEwLGZvcm1EYXRhOiJGb3JtRGF0YSJpbiBzZWxmLGFycmF5QnVmZmVyOiJBcnJheUJ1ZmZlciJpbiBzZWxmfTtpZihaLmFycmF5QnVmZmVyKXZhciByYj0iW29iamVjdCBJbnQ4QXJyYXldO1tvYmplY3QgVWludDhBcnJheV07W29iamVjdCBVaW50OENsYW1wZWRBcnJheV07W29iamVjdCBJbnQxNkFycmF5XTtbb2JqZWN0IFVpbnQxNkFycmF5XTtbb2JqZWN0IEludDMyQXJyYXldO1tvYmplY3QgVWludDMyQXJyYXldO1tvYmplY3QgRmxvYXQzMkFycmF5XTtbb2JqZWN0IEZsb2F0NjRBcnJheV0iLnNwbGl0KCI7IiksCmliPUFycmF5QnVmZmVyLmlzVmlld3x8ZnVuY3Rpb24ocCl7cmV0dXJuIHAmJi0xPHJiLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHApKX07Zi5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKHAsQil7cD1jKHApO0I9ZChCKTt2YXIgSj10aGlzLm1hcFtwXTt0aGlzLm1hcFtwXT1KP0orIiwgIitCOkJ9O2YucHJvdG90eXBlWyJkZWxldGUiXT1mdW5jdGlvbihwKXtkZWxldGUgdGhpcy5tYXBbYyhwKV19O2YucHJvdG90eXBlLmdldD1mdW5jdGlvbihwKXtwPWMocCk7cmV0dXJuIHRoaXMuaGFzKHApP3RoaXMubWFwW3BdOm51bGx9O2YucHJvdG90eXBlLmhhcz1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5tYXAuaGFzT3duUHJvcGVydHkoYyhwKSl9O2YucHJvdG90eXBlLnNldD1mdW5jdGlvbihwLEIpe3RoaXMubWFwW2MocCldPWQoQil9O2YucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24ocCxCKXtmb3IodmFyIEogaW4gdGhpcy5tYXApdGhpcy5tYXAuaGFzT3duUHJvcGVydHkoSikmJgpwLmNhbGwoQix0aGlzLm1hcFtKXSxKLHRoaXMpfTtmLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7dmFyIHA9W107dGhpcy5mb3JFYWNoKGZ1bmN0aW9uKEIsSil7cC5wdXNoKEopfSk7cmV0dXJuIGUocCl9O2YucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3ZhciBwPVtdO3RoaXMuZm9yRWFjaChmdW5jdGlvbihCKXtwLnB1c2goQil9KTtyZXR1cm4gZShwKX07Zi5wcm90b3R5cGUuZW50cmllcz1mdW5jdGlvbigpe3ZhciBwPVtdO3RoaXMuZm9yRWFjaChmdW5jdGlvbihCLEope3AucHVzaChbSixCXSl9KTtyZXR1cm4gZShwKX07Wi5DZCYmKFVhKCksdWIoKSxmLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWYucHJvdG90eXBlLmVudHJpZXMpO3ZhciBzYj0iREVMRVRFIEdFVCBIRUFEIE9QVElPTlMgUE9TVCBQVVQiLnNwbGl0KCIgIik7Ti5jYWxsKG1hLnByb3RvdHlwZSk7Ti5jYWxsKFkucHJvdG90eXBlKTtZLmVycm9yPWZ1bmN0aW9uKCl7dmFyIHA9bmV3IFkobnVsbCwKe3N0YXR1czowLHN0YXR1c1RleHQ6IiJ9KTtwLnR5cGU9ImVycm9yIjtyZXR1cm4gcH07dmFyIGpjPVszMDEsMzAyLDMwMywzMDcsMzA4XTtZLnJlZGlyZWN0PWZ1bmN0aW9uKHAsQil7aWYoLTE9PT1qYy5pbmRleE9mKEIpKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHN0YXR1cyBjb2RlIik7cmV0dXJuIG5ldyBZKG51bGwse3N0YXR1czpCLGhlYWRlcnM6e2xvY2F0aW9uOnB9fSl9O2EuRE9NRXhjZXB0aW9uPXNlbGYuRE9NRXhjZXB0aW9uO3RyeXtuZXcgYS5ET01FeGNlcHRpb259Y2F0Y2gocCl7YS5ET01FeGNlcHRpb249ZnVuY3Rpb24oQixKKXt0aGlzLm1lc3NhZ2U9Qjt0aGlzLm5hbWU9Sjt0aGlzLnN0YWNrPUVycm9yKEIpLnN0YWNrfSxhLkRPTUV4Y2VwdGlvbi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpLGEuRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hLkRPTUV4Y2VwdGlvbn14YS5hPSEwO3NlbGYuZmV0Y2h8fChzZWxmLmZldGNoPQp4YSxzZWxmLkhlYWRlcnM9ZixzZWxmLlJlcXVlc3Q9bWEsc2VsZi5SZXNwb25zZT1ZKTthLkhlYWRlcnM9ZjthLlJlcXVlc3Q9bWE7YS5SZXNwb25zZT1ZO2EuZmV0Y2g9eGE7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7ZGEuYT1mdW5jdGlvbihhLGMpe2M9dm9pZCAwPT09Yz8hMDpjO3JldHVybiBPYmplY3Qua2V5cyhhKS5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIGM/W2QsYVtkXV0ubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbigiPSIpOltkLGFbZF1dLmpvaW4oIj0iKX0pLmpvaW4oIiYiKX07ZGEuYj1mdW5jdGlvbihhKXtbe3BhdHRlcm46L1xbKHJhbmRvbXxybmR8Y2FjaGVidXN0ZXJ8Y29ycmVsYXRvcilcXS9nLHZhbHVlOmcuai5zKDEwKX0se3BhdHRlcm46L1xbKHJlZmVycmVyX3VybClcXS9nLHZhbHVlOmRvY3VtZW50LnJlZmVycmVyfSx7cGF0dGVybjovXFsoZGVzY3JpcHRpb25fdXJsfHVybClcXS9nLHZhbHVlOmRvY3VtZW50LmxvY2F0aW9uLmhyZWZ9LAp7cGF0dGVybjovXFsodGltZXx0aW1lc3RhbXApXF0vZyx2YWx1ZToobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpfV0uZm9yRWFjaChmdW5jdGlvbihjKXthPWEucmVwbGFjZShjLnBhdHRlcm4sYy52YWx1ZSl9KTtyZXR1cm4gYX07ZGEucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXt0aGlzLmEucXVlcnlLZXkuZ2Rwcl9jb25zZW50PSJbZ2Rwcl9jb25zZW50XSI7dGhpcy5hLnF1ZXJ5PWRhLmEodGhpcy5hLnF1ZXJ5S2V5LCExKTt0aGlzLmMoKX07ZGEucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSxjKXt0aGlzLmEucXVlcnlLZXlbYV09Yzt0aGlzLmEucXVlcnk9ZGEuYSh0aGlzLmEucXVlcnlLZXksITEpO3RoaXMuYygpfTtkYS5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLnF1ZXJ5S2V5W2FdfTtkYS5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLnF1ZXJ5S2V5Lmhhc093blByb3BlcnR5KGEpfTtkYS5wcm90b3R5cGUuYz1mdW5jdGlvbigpe3RoaXMucGFyc2UodGhpcy50b1N0cmluZygpKX07CmRhLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblt0aGlzLmEucHJvdG9jb2wubGVuZ3RoP3RoaXMuYS5wcm90b2NvbCsiOi8vIjoiIix0aGlzLmEudWQsdGhpcy5hLnBhdGgsdGhpcy5hLnF1ZXJ5Lmxlbmd0aD8iPyIrdGhpcy5hLnF1ZXJ5OiIiLHRoaXMuYS5hbmNob3IubGVuZ3RoPyIjIit0aGlzLmEuYW5jaG9yOiIiXS5qb2luKCIiKX07ZGEucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXM7YT1kYS5iKGEpO3RoaXMuZj10aGlzLnYuY2RbdGhpcy52LkplPyJzdHJpY3QiOiJsb29zZSJdLmV4ZWMoYSk7YT0xNDtmb3IodmFyIGQ9e307YS0tOylkW3RoaXMudi5rZXlbYV1dPXRoaXMuZlthXXx8IiI7ZFt0aGlzLnYucS5uYW1lXT17fTtkW3RoaXMudi5rZXlbMTJdXS5yZXBsYWNlKHRoaXMudi5xLmNkLGZ1bmN0aW9uKGUsZixoKXtmJiYoZFtjLnYucS5uYW1lXVtmXT1oKX0pO3JldHVybiBkfTtRYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhkYS5wcm90b3R5cGUsCnt2Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57SmU6ITEsa2V5OiJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJpbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpLHE6e25hbWU6InF1ZXJ5S2V5IixjZDovKD86XnwmKShbXiY9XSopPT8oW14mXSopL2d9LGNkOntzdHJpY3Q6L14oPzooW146XC8/I10rKTopPyg/OlwvXC8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKT8oKCgoPzpbXj8jXC9dKlwvKSopKFtePyNdKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8sbG9vc2U6L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS99fX19LApwcm90b2NvbDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5wcm90b2NvbH19LHVkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLnVkfX0saG9zdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5ob3N0fX0scGF0aDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5wYXRofX0scXVlcnk6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEucXVlcnl9fSxhbmNob3I6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuYW5jaG9yfX19KTt2YS5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5OLmhhcyhhKT8oYyh0aGlzLk4uZ2V0KGEpKSwKITApOiExfTt2YS5wcm90b3R5cGUub249ZnVuY3Rpb24oYSxjLGQpe2Q9dm9pZCAwPT09ZD8hMTpkO3RoaXMuRi5oYXMoYSl8fHRoaXMuRi5zZXQoYSxbXSk7dGhpcy5GLmdldChhKS5wdXNoKGMpO2QmJnRoaXMuYWEoYSxjKX07dmEucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24oYSxjLGQpe2Q9dm9pZCAwPT09ZD8hMTpkO3RoaXMuby5oYXMoYSl8fHRoaXMuby5zZXQoYSxbXSk7ZCYmdGhpcy5hYShhLGMpfHx0aGlzLm8uZ2V0KGEpLnB1c2goYyl9O3ZhLnByb3RvdHlwZS5nPWZ1bmN0aW9uKGEpe3ZhciBjPXZvaWQgMD09PWM/ITA6YztpZighMD09PWMpdGhpcy5GLmRlbGV0ZShhKSx0aGlzLm8uZGVsZXRlKGEpO2Vsc2V7dmFyIGQ9ZnVuY3Rpb24oZSl7dmFyIGY9ZS5nZXQoYSk7ZiYmZS5zZXQoYSxmLmZpbHRlcihmdW5jdGlvbihoKXtyZXR1cm4gaCE9PWN9KSl9O2QodGhpcy5GKTtkKHRoaXMubyl9fTt2YS5wcm90b3R5cGUuTD1mdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoaCxtLEQpe2Zvcih2YXIgTD0KW10sTz0yO088YXJndW1lbnRzLmxlbmd0aDsrK08pTFtPLTJdPWFyZ3VtZW50c1tPXTsoTz1oLmdldChtKSkmJk8ubGVuZ3RoJiZPLmZvckVhY2goZnVuY3Rpb24oTil7Ti5hcHBseShudWxsLEZiKEwpKX0pfWZvcih2YXIgZT1bXSxmPTE7Zjxhcmd1bWVudHMubGVuZ3RoOysrZillW2YtMV09YXJndW1lbnRzW2ZdO3RoaXMuTi5zZXQuYXBwbHkodGhpcy5OLFthXS5jb25jYXQoRmIoZSkpKTtkLmFwcGx5KG51bGwsW3RoaXMubyxhXS5jb25jYXQoRmIoZSkpKTtkLmFwcGx5KG51bGwsW3RoaXMuRixhXS5jb25jYXQoRmIoZSkpKTt0aGlzLm8uZGVsZXRlKGEpfTtDYS5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXt2YXIgYz0wLGQ7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGM7dmFyIGU9MDtmb3IoZD1hLmxlbmd0aDtlPGQ7ZSsrKXt2YXIgZj1hLmNoYXJDb2RlQXQoZSk7Yz0oYzw8NSktYytmO2N8PTB9cmV0dXJuIE1hdGguYWJzKGMpfTtDYS5wcm90b3R5cGUueWE9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLwoxRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5hfHwieCIpfTtDYS5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuYXx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfTtDYS5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXthPXBhcnNlSW50KGEsMTApO3JldHVybiA2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWE/U3RyaW5nLmZyb21DaGFyQ29kZShhKTowPj0KYT8iIjo2NT5hP3RoaXMuYihhKzY1KTo5MDxhP3RoaXMuYihNYXRoLnJvdW5kKGEvMikpOmEudG9TdHJpbmcoKX07Q2EucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWEubGVuZ3RoLTEsZD0iIjswPD1jO2QrPWFbYy0tXSk7cmV0dXJuIGR9O0NhLnByb3RvdHlwZS5hPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nKHRoaXMueWEoKSk7YT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyk7Zm9yKHZhciBjPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyljKz10aGlzLmIoYVtkXSk7MD09Yy5sZW5ndGgmJihjPSJ6b3JrIik7cmV0dXJuIGN9O0NhLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYSgpKyIyIn07Q2EucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmcodGhpcy5pKCkpO2E9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpO2Zvcih2YXIgYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYys9CnRoaXMuYihhW2RdKTswPT1jLmxlbmd0aCYmKGM9InpvcmsiKTtyZXR1cm4gY307b2IucHJvdG90eXBlLm09ZnVuY3Rpb24oKXtmb3IodmFyIGE9d2luZG93OyF0aGlzLmI7KXt0cnl7aWYoYS5mcmFtZXMuX190Y2ZhcGlMb2NhdG9yfHxhLmZyYW1lcy5fX2NtcExvY2F0b3IpdGhpcy5iPWF9Y2F0Y2goYyl7fWlmKGE9PT13aW5kb3cudG9wKWJyZWFrO2lmKGE9PT1hLnBhcmVudClicmVhazthPWEucGFyZW50fXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmMuYmluZCh0aGlzKSl9O29iLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEsYyxkLGUpe2lmKHRoaXMuYil7dmFyIGY9TWF0aC5yYW5kb20oKSsiIjthPXtfX3RjZmFwaUNhbGw6e2NvbW1hbmQ6YSxwYXJhbWV0ZXI6ZSx2ZXJzaW9uOmMsY2FsbElkOmZ9fTt0aGlzLmFbZl09ZDt0aGlzLmIucG9zdE1lc3NhZ2UoYSwiKiIpfWVsc2UgZCh7bXNnOiJDTVAgbm90IGZvdW5kIn0sITEpfTtvYi5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYz0Ke307aWYoInN0cmluZyI9PT10eXBlb2YgYS5kYXRhKXRyeXtjPUpTT04ucGFyc2UoYS5kYXRhKX1jYXRjaChkKXt9ZWxzZSBjPWEuZGF0YTtjJiZjLl9fdGNmYXBpUmV0dXJuJiYoYT1jLl9fdGNmYXBpUmV0dXJuKSYmYS5jYWxsSWQmJnRoaXMuYSYmdGhpcy5hW2EuY2FsbElkXSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuYVthLmNhbGxJZF0mJih0aGlzLmFbYS5jYWxsSWRdKGEucmV0dXJuVmFsdWUsYS5zdWNjZXNzKSxkZWxldGUgdGhpcy5hW2EuY2FsbElkXSl9O29iLnByb3RvdHlwZS5sPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjO0ZjKGZ1bmN0aW9uKGQpe2M9YS5mLmJpbmQoYSk7IWEuYiYmd2luZG93Ll9fdGNmYXBpJiYoYz13aW5kb3cuX190Y2ZhcGkpO3JldHVybiBkLnJldHVybihuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtjKCJnZXRUQ0RhdGEiLDIsZnVuY3Rpb24oZixoKXtoPyh0aGlzLmk9Zix0aGlzLmRjPWYudGNTdHJpbmcsdGhpcy5WYz10aGlzLmkuZ2RwckFwcGxpZXMsCmUodGhpcy5kYykpOmUoITEpfS5iaW5kKGEpKX0pKX0pfTtvYi5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMubSgpO3RoaXMubCgpfTtnLlVhPW5ldyBvYjtnLlVhLmcoKTt1LnByb3RvdHlwZS5OYj1mdW5jdGlvbihhKXt0aGlzLmc9YX07dS5wcm90b3R5cGUuWmI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmcubWluVmlzO3RoaXMuZ1t0aGlzLmJhXSYmdGhpcy5nW3RoaXMuYmFdLm1pblZpcyYmKGE9dGhpcy5nW3RoaXMuYmFdLm1pblZpcyk7cmV0dXJuIGF9O3UucHJvdG90eXBlLlNlPWZ1bmN0aW9uKCl7InByZXJvbGwiPT1nLmouVSYmZy5qLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuTygpLCEwKTt0aGlzLk5lKCk7Zy5qLmEodi51LHRoaXMuYigpKX07dS5wcm90b3R5cGUuZWE9ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPXRoaXM7Zy5qLk4oKSYmKCh0aGlzLmM9Zy5qLkVkKXx8Zy5qLnRyYWNrKCJ2cnRjbHpyX25vaW50ZXJhY3Rpb24iLCIiLCEwKSk7InZlcnRpY2FsaXpyIj09PQphJiYodGhpcy5jPSEwKTtnLmouZmE9bnVsbDtpZih0aGlzLmkuYil0aGlzLmdhKyssdGhpcy5pLkxiKCksZy5qLkliKCkmJnRoaXMuZ2IoKSYmdGhpcy5oYigpP3RoaXMuVGIoKTooZy5ILmdldENvbmZpZygpLHRoaXMuaS5KYSYmdGhpcy5pLmE/KGcuai5BYihhKSx0aGlzLmM/KHRoaXMuVT0hMCx0aGlzLmw9bmV3IFYsdGhpcy5mYSgpKToodGhpcy5TZSgpLHRoaXMubD1uZXcgVihhKSx0aGlzLmwub24oImNvbXBsZXRlIixmdW5jdGlvbihoKXtoLndjP2UuZmEoKTplLkYoKX0sITApLHRoaXMubC5vbigiZXJyb3IiLGZ1bmN0aW9uKGgpe2Uuc2EoaCk7ZS5GKCl9LCEwKSkpOnRoaXMuRigpKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuZWEoYSxjLGQpfSw1MCl9fTt1LnByb3RvdHlwZS5mYT1mdW5jdGlvbigpe3RoaXMuRmE9dGhpcy5pYT10aGlzLnBhPSExOyh0aGlzLkM9dGhpcy5sP3RoaXMubC5ZYygpOm51bGwpPygid2VsZWN0Ij09PXRoaXMuQiYmZy52LmIoImFkX2ZhbGxiYWNrIikmJgpnLmoudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsITAsITApLHRoaXMuT2IodGhpcy5DKSx0aGlzLkdiKHRoaXMuQyksdGhpcy5ZPXRoaXMuRmIodGhpcy5DKSx0aGlzLlpkKCkpOnRoaXMuYz90aGlzLk9iKHRoaXMuQyk6dGhpcy50YygpfTt1LnByb3RvdHlwZS5zYT1mdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5sLmksZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZmIoY1tkXSxjW2RdLmVycm9yKTt0aGlzLkMgaW5zdGFuY2VvZiBqYSYmKHRoaXMuQy5lcnJvcj1hJiZhIGluc3RhbmNlb2YgQz9hOm5ldyBDKEMuRiksdGhpcy5mYih0aGlzLkMsdGhpcy5DLmVycm9yKSl9O3UucHJvdG90eXBlLmZiPWZ1bmN0aW9uKGEsYyl7c3dpdGNoKGMudHlwZSl7Y2FzZSBDLmc6Yy5kZXRhaWxzPT1DLmEuU2Q/Zy5qLmEodi5nYSx0aGlzLmIoKSk6KGcuai5tYSgpLGMuZGV0YWlscz09Qy5hLlBkLmNvZGUmJmcuai5hKHYuVSx0aGlzLmIoKSkpO2cuai5hKHYuTyx0aGlzLmIoKSk7dGhpcy5PZSgpOwp0aGlzLm8oImVtcHR5Iik7IndlbGVjdCI9PT10aGlzLkImJmcudi5iKCJhZF9mYWxsYmFjayIpJiZnLmoudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsITEsITApO3RoaXMuaS5hYSYmZy5qLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuaS5hYSwhMCk7YnJlYWs7Y2FzZSBDLmI6Zy5qLmEodi5kYSx0aGlzLmIoKSk7dGhpcy5vKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2UgQy5BOmcuai5hKHYuaGEsdGhpcy5iKCkpO3RoaXMubygid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSBDLm86Zy5qLmEodi5pYSx0aGlzLmIoKSk7dGhpcy5vKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2UgQy5pOmcuai5hKHYuaSx0aGlzLmIoKSk7dGhpcy5vKCJub21lZGlhIik7YnJlYWs7Y2FzZSBDLm06Zy5qLmEodi5pLHRoaXMuYigpKTt0aGlzLm8oIm1lZGlhZXJyb3IiKTticmVhaztjYXNlIEMuZjpnLmouYSh2LmJhLHRoaXMuYigpKTt0aGlzLm8oImR1bW15YWQiKTticmVhazsKY2FzZSBDLmw6Zy5qLmEodi5aLHRoaXMuYigpKTt0aGlzLm8oImR1cmF0aW9uIik7YnJlYWs7Y2FzZSBDLmM6Zy5qLmEodi5pLHRoaXMuYigpKTtjJiZjLmRhdGEmJmMuZGF0YS5kZXRhaWxzJiZjLmRhdGEuZGV0YWlscy5jb2RlPT1DLmEubWQuY29kZT90aGlzLm8oIk9OTFlfTUVaWkFOSU5FIik6dGhpcy5vKCJOT19QTEFZQUJMRV9BRFMiKTticmVhaztkZWZhdWx0OnRoaXMubygidW5rbm93biIpfWEmJmEuamEmJnRoaXMudWUoYSxhLmVycm9yLnR5cGUuY29kZSl9O3UucHJvdG90eXBlLnVlPWZ1bmN0aW9uKGEsYyl7YT1hLmphLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4iZXJyb3IiPT09ZS5pZH0pO2lmKDkwMTxjfHwxPmMpYz05MDA7Zm9yKGM9eyJbRVJST1JDT0RFXSI6Y307YS5sZW5ndGg7KXRyeXt2YXIgZD1hLnBvcCgpO3RoaXMuZGEoZC51cmwsZC50eXBlLGMpfWNhdGNoKGUpe319O3UucHJvdG90eXBlLkdiPWZ1bmN0aW9uKGEpe2lmKGEpe2Eub3JpZ2luJiYoYT1hLm9yaWdpbik7CmlmKGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIHUpdHJ5e3RoaXMuaGE9dGhpcy55ZShhKX1jYXRjaChjKXt9dGhpcy5HYihhLnBhcmVudCl9fTt1LnByb3RvdHlwZS5GYj1mdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIHV8fChjPXRoaXMuRmIoYS5wYXJlbnQpKSxjLnB1c2godGhpcy52ZShhKSkpO3JldHVybiBjfTt1LnByb3RvdHlwZS52ZT1mdW5jdGlvbihhKXt2YXIgYz0iIixkPVtdO2lmKGEmJmEuUWEmJmEuUWEuZ2V0QXR0cmlidXRlKXtjPWEuUWEuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5RYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkLnB1c2goYVtlXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpjLGNyZWF0aXZlSUQ6ZH19O3UucHJvdG90eXBlLnllPQpmdW5jdGlvbihhKXt2YXIgYz1bXSxkPVtdLGU9IiI7aWYoYS5RYSl7dmFyIGY9YS5RYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO3ZhciBoPWEuUWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5RYS5nZXRBdHRyaWJ1dGUoImlkIikmJihlPWEuUWEuZ2V0QXR0cmlidXRlKCJpZCIpLGQucHVzaChlKSk7YS5RYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGU9YS5RYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxkLnB1c2goZSkpO2Zvcih2YXIgbT0wO208aC5sZW5ndGg7bSsrKWhbbV0uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZT1oW21dLmdldEF0dHJpYnV0ZSgiaWQiKSxkLnB1c2goZSkpLGhbbV0uZ2V0QXR0cmlidXRlKCJhZElEIikmJihlPWhbbV0uZ2V0QXR0cmlidXRlKCJhZElEIiksZC5wdXNoKGUpKTtmb3IobT0wO208Zi5sZW5ndGg7bSsrKWMucHVzaChhLkFkKGZbbV0pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczpkLGFkSWQ6ZX19O3UucHJvdG90eXBlLlJhPQpmdW5jdGlvbigpe3RoaXMuTj0hMX07dS5wcm90b3R5cGUuTGM9ZnVuY3Rpb24oKXt0aGlzLnMucmVtb3ZlQ2hpbGQodGhpcy5mKTt0aGlzLm09dGhpcy5jb250cm9scz1udWxsO3RoaXMuVj0hMTt0aGlzLktiKHRoaXMuZGlzcGxheSk7dGhpcy5kaXNwbGF5LnJlbW92ZSgpfTt1LnByb3RvdHlwZS5PYj1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmEuWGMoKSxkPWcudi5iKCJjb250YWluZXIuc3R5bGUiKSxlPXBhcnNlSW50KGcudi5iKCJ6SW5kZXgiKXx8MUU0LDEwKTstLWU7ZCYmZy5qLnFhKGMsZCsiIik7Yy56SW5kZXg9ZTt0aGlzLnM9Yzt0aGlzLmRpc3BsYXk9bnVsbDt0aGlzLmRpc3BsYXk9dGhpcy5jZShhKTt0aGlzLmRpc3BsYXkuQmUoYSk7dGhpcy5kaXNwbGF5LmhkKHRoaXMuYSk7dGhpcy5kaXNwbGF5LkRlKHRoaXMuYWEoKSk7dGhpcy5kaXNwbGF5LkVlKGMpO3RoaXMuUWMmJnRoaXMucGxheWVyLldjKCkmJnRoaXMuZGlzcGxheS5GZSh0aGlzLnBsYXllci5XYygpLzEwMCk7CnRoaXMuUGModGhpcy5kaXNwbGF5KTt0aGlzLmRpc3BsYXkuVCgpPyh0aGlzLktlKHRoaXMuTygpKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGcudi5iKCJpbm5lcldhcnBwZXIuc3R5bGUiKT9hLnN0eWxlPWcudi5iKCJpbm5lcldhcnBwZXIuc3R5bGUiKSsiIjooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIix0aGlzLmMmJihhLnN0eWxlLnRvcD0iOHB4IixhLnN0eWxlLmxlZnQ9IjhweCIsYS5zdHlsZS53aWR0aD0iY2FsYygxMDAlIC0gMTZweCkiLGEuc3R5bGUuaGVpZ2h0PSJjYWxjKDEwMCUgLSAxNnB4KSIsYS5zdHlsZS5ib3JkZXI9IjFweCBzb2xpZCB3aGl0ZSIpKSx0aGlzLmY9dGhpcy5zLmFwcGVuZENoaWxkKGEpLHRoaXMuYyYmdGhpcy5kaXNwbGF5IGluc3RhbmNlb2YgUiYmdGhpcy5hLlVjKCEwKSx0aGlzLmRpc3BsYXkuc2IodGhpcy5mKSk6dGhpcy5LYih0aGlzLmRpc3BsYXkpfTsKdS5wcm90b3R5cGUuaGQ9ZnVuY3Rpb24oYSl7dGhpcy5hPWF9O3UucHJvdG90eXBlLmNlPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMsZD1udWxsLGU9bnVsbCxmPW51bGw7aWYoYSYmYS51KCkpe3RyeXsoZT10aGlzLmEuUy5nZXRSYXdQbGF5ZXIoKSkmJmUuZW52dmFycyYmKGY9ZS5lbnZ2YXJzKCkpO2YudmlkZW9TbG90fHwoZT10aGlzLmEuUykmJmUudmMmJihmPWUudmMoKSk7aWYoZi52aWRlb1Nsb3QpcmV0dXJuIGQ9bmV3IE9hLGQucyhmLnZpZGVvU2xvdCksZDt0aHJvdyJ2aWRlb1RhZyI7fWNhdGNoKGgpe2Q9bmV3IE19Zy5wYz9kPW5ldyBvYTpkPW5ldyBNfWVsc2UgYSYmYS5mKCk/KHRoaXMuR2E9ITAsZD1uZXcgVyk6dGhpcy5jJiYoZy5CYz8oZD1nLkJjLGQuY29udGludWUoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkViLmJpbmQodGhpcyksMCkpOmQ9bmV3IFIsdGhpcy5DPW5ldyBqYShbXSxbXSxbXSxudWxsKSx0aGlzLkMuemM9NSx0aGlzLmEuZyhmdW5jdGlvbihoKXtjLmRpc3BsYXkucmVzaXplKGgpfSkpOwpyZXR1cm4gZH07dS5wcm90b3R5cGUuUGM9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpczthLm9uKGEuZXZlbnQuWGIsdGhpcy5FYi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQub2MsdGhpcy5zZS5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuRmMsdGhpcy5CYi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuSmMsdGhpcy5sYi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuRGMsdGhpcy56Yi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuRWMsdGhpcy5BYi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuR2MsdGhpcy5DYi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuS2MsdGhpcy5uYi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQub2QsdGhpcy5xZS5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQucGQsdGhpcy5vYi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQubGMsdGhpcy55Yi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuTmEsdGhpcy5lZS5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuT2EsdGhpcy5wZS5iaW5kKHRoaXMpKTsKYS5vbihhLmV2ZW50LkhjLHRoaXMubmEuYmluZCh0aGlzKSk7YS5vbihhLmV2ZW50Lm5kLHRoaXMub2EuYmluZCh0aGlzKSk7dGhpcy5jJiYoYS5vbigiY2xvc2UiLGZ1bmN0aW9uKCl7Yy5qYygpO2MuYS5VYyghMSk7Yy5mLnN0eWxlLnRvcD0iMCI7Yy5mLnN0eWxlLmxlZnQ9IjAiO2MuZi5zdHlsZS53aWR0aD0iMTAwJSI7Yy5mLnN0eWxlLmhlaWdodD0iMTAwJSI7Yy5mLnN0eWxlLmJvcmRlcj0ibm9uZSJ9KSxhLm9uKCJ1bmNsb3NlIixmdW5jdGlvbigpe2MuYS5VYyghMCk7Yy5mLnN0eWxlLnRvcD0iOHB4IjtjLmYuc3R5bGUubGVmdD0iOHB4IjtjLmYuc3R5bGUud2lkdGg9ImNhbGMoMTAwJSAtIDE2cHgpIjtjLmYuc3R5bGUuaGVpZ2h0PSJjYWxjKDEwMCUgLSAxNnB4KSI7Yy5mLnN0eWxlLmJvcmRlcj0iMXB4IHNvbGlkIHdoaXRlIn0pLGEub24oIlNIT1dDT05UUk9MUyIsZnVuY3Rpb24oKXt0aGlzLkcoKTt0aGlzLkQoKX0uYmluZCh0aGlzKSkpfTt1LnByb3RvdHlwZS5LYj1mdW5jdGlvbihhKXthLmcoYS5ldmVudC5YYik7CmEuZyhhLmV2ZW50Lm9jKTthLmcoYS5ldmVudC5GYyk7YS5nKGEuZXZlbnQuSmMpO2EuZyhhLmV2ZW50LkRjKTthLmcoYS5ldmVudC5FYyk7YS5nKGEuZXZlbnQuR2MpO2EuZyhhLmV2ZW50LktjKTthLmcoYS5ldmVudC5OYSk7YS5nKGEuZXZlbnQuT2EpfTt1LnByb3RvdHlwZS5FYj1mdW5jdGlvbigpe3RoaXMuT2MoKTt0aGlzLmEuTigpO3RoaXMuZGlzcGxheSBpbnN0YW5jZW9mIFd8fHRoaXMuS2QoKTt0aGlzLkxkKCk7dGhpcy5qYigpO3RoaXMuYS5EKCk7dGhpcy5BZSgpO3RoaXMuYyYmdGhpcy51KCl9O3UucHJvdG90eXBlLnNlPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuYS5TO2E9YS5jdXJyZW50VGltZTt0aGlzLlZiPSEwO2MuSGEmJmMuSGEoKSYmZy5qLmEodi5iLHRoaXMuYigpKTtjPU1hdGguZmxvb3IoYSk7dGhpcy5IZChjKTtpZighdGhpcy5pYSl7YT0yRTM7dmFyIGQ9NTAsZT1nLnYuYigidmlld2FibGVJbXByZXNzaW9uIik7ZSYmKGUucGVyY2VudCYmKGQ9ZS5wZXJjZW50KSwKZS50aW1lTVMmJihhPWUudGltZU1TKSk7dGhpcy5pYT17ZGlzcGxheTp0aGlzLmRpc3BsYXksY2I6ZnVuY3Rpb24oKXt0aGlzLkZhPSEwO2cuai5hKHYuZWEsdGhpcy5iKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmEscGVyY2VudDpkLHN0YXJ0VGltZTohMX07Zy5qLkdhKHRoaXMuaWEpfWE9IiI7dGhpcy5DLnpjJiYoZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSkmJihjPXRoaXMuQy56Yy1jLDA8Yz9hPWcudi5iKCJza2lwYWJsZUJ1dHRvbiIpOihhPWcudi5iKCJza2lwQnV0dG9uIiksdGhpcy5WfHwodGhpcy5WPSEwLGcuai50cmFjaygidnJ0Y2x6cl9za2lwX2FjdGl2ZSIsIiIsITApLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmRhKCk7dGhpcy50cmFjaygic2tpcCIpO2cuai5hKHYuYyx0aGlzLmIoKSk7dGhpcy5DLnNkPyh0aGlzLkxjKCksdGhpcy5DLm9yaWdpbi5zZigpKTp0aGlzLkYoKX0uYmluZCh0aGlzKSkpKSwKdGhpcy5kaXNwbGF5LkIoYSkmJihhPXRoaXMuZGlzcGxheS5CKGEpKSxhPWEucmVwbGFjZSgiW3RpbWVdIixjKSxkLmlubmVySFRNTD1hKTt0aGlzLm0mJihjPXRoaXMuZGlzcGxheS5nZXREdXJhdGlvbigpLGE9dGhpcy5kaXNwbGF5LmdldEN1cnJlbnRUaW1lKCksdGhpcy5tLmlubmVySFRNTD10aGlzLloucmVwbGFjZSgiW3RpbWVdIixnLmoud2EoYy1hKSksdGhpcy5jJiZ0aGlzLnUoKSl9O3UucHJvdG90eXBlLnpiPWZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9O3UucHJvdG90eXBlLkJiPWZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUHx8dGhpcy5QZSgpO2cuai5hKHYubSx0aGlzLmIoKSl9O3UucHJvdG90eXBlLmxiPWZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlNiKCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TYigpfS5iaW5kKHRoaXMpKTsKdGhpcy50cmFjaygic3RhcnQiKTt0aGlzLmkubyYmdGhpcy5XKCJzdGFydCIpO2cuai5hKHYuQix0aGlzLmIoKSk7dGhpcy5jJiZ0aGlzLkQoKX07dS5wcm90b3R5cGUuQWI9ZnVuY3Rpb24oKXt0aGlzLmkubyYmKGcuai50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5XKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5wYT0hMCk7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2cuai5hKHYubCx0aGlzLmIoKSl9O3UucHJvdG90eXBlLkNiPWZ1bmN0aW9uKCl7dGhpcy5pLm8mJihnLmoudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlcoIm1pZHBvaW50IikpO3RoaXMudHJhY2soIm1pZHBvaW50Iik7Zy5qLmEodi5GLHRoaXMuYigpKX07dS5wcm90b3R5cGUubmI9ZnVuY3Rpb24oKXt0aGlzLmkubyYmKGcuai50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5XKCJ0aGlyZFF1YXJ0aWxlIikpO3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKZy5qLmEodi5ELHRoaXMuYigpKX07dS5wcm90b3R5cGUucWU9ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zy5qLmEodi5jLHRoaXMuYigpKX07dS5wcm90b3R5cGUub2I9ZnVuY3Rpb24oKXtnLmouYSh2LkcsdGhpcy5iKCkpO3RoaXMuZGlzcGxheSYmdGhpcy5kaXNwbGF5LmdldEN1cnJlbnRUaW1lJiZ0aGlzLmRpc3BsYXkuZ2V0RHVyYXRpb24mJnRoaXMuSWQodGhpcy5kaXNwbGF5LmdldEN1cnJlbnRUaW1lKCksdGhpcy5kaXNwbGF5LmdldER1cmF0aW9uKCkpfTt1LnByb3RvdHlwZS5uYT1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuemEpO2EmJihhLmlubmVySFRNTD10aGlzLmcucGxheUJ1dHRvbik7dGhpcy5BJiYodGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkkoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygicGF1c2UiLCEwKTtnLmouYSh2LkEsdGhpcy5iKCkpfTt1LnByb3RvdHlwZS5vYT1mdW5jdGlvbigpeyJ3ZWxlY3QiPT09CnRoaXMuQiYmKHRoaXMuVT0hMSx0aGlzLkcoKSk7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy56YSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuZy5wYXVzZUJ1dHRvbik7dGhpcy5BJiYodGhpcy5BLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtnLmouYSh2LnMsdGhpcy5iKCkpO3RoaXMuYyYmdGhpcy5EKCl9O3UucHJvdG90eXBlLkRiPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy50YSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuZy51bm11dGVCdXR0b24pO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlFiKCJtdXRlZCIpO2cuai5hKHYuWGEsdGhpcy5iKCkpfTt1LnByb3RvdHlwZS5wYj1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudGEpO2EmJihhLmlubmVySFRNTD10aGlzLmcubXV0ZUJ1dHRvbik7dGhpcy50cmFjaygidW5tdXRlIiwhMCk7dGhpcy5RYigidW5tdXRlZCIpOwpnLmouYSh2LiRhLHRoaXMuYigpKX07dS5wcm90b3R5cGUueWI9ZnVuY3Rpb24oYSl7dGhpcy5hLlMmJnRoaXMuYS5TLnlkJiZ0aGlzLmEuUy55ZCgpO2lmKGcuai5yYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5jJiYodGhpcy5VPSExKSx0aGlzLkcoKTtlbHNlIGlmKGF8fHRoaXMuQy5VYil7dHJ5e3ZhciBjPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuQy5zY3x8KHRoaXMuQy5zYz0xKTtpZigxMDA+Yy10aGlzLkMuc2MpcmV0dXJuO3RoaXMuQy5zYz1jfWNhdGNoKGQpe31nLmouYSh2Lk4sdGhpcy5iKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTthPSJfdG9wIjtpZih0aGlzLmkuZGF8fCJ3ZWxlY3QiPT09dGhpcy5CKWE9Il9ibGFuayI7d2luZG93Lm9wZW4odGhpcy5DLlViLGEpfX07dS5wcm90b3R5cGUuZWU9ZnVuY3Rpb24oKXtpZih0aGlzLkMpZy5ILm8mJiF0aGlzLlAmJihnLmoudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLAohMCksdGhpcy5XKCJjb21wbGV0ZSIpKSx0aGlzLnRyYWNrKCJjb21wbGV0ZSIpLGcuai5hKHYuZix0aGlzLmIoKSksdGhpcy5GKCk7ZWxzZSBpZih0aGlzLmMpe3RoaXMuTj0hMTt0aGlzLmdhKys7dHJ5e3RoaXMuZGlzcGxheS5yZW1vdmUoKX1jYXRjaChhKXt9dHJ5e3RoaXMucy5yZW1vdmVDaGlsZCh0aGlzLmYpfWNhdGNoKGEpe310aGlzLm09dGhpcy5jb250cm9scz1udWxsO3RoaXMuVj0hMTt0aGlzLmRpc3BsYXkucGF1c2UoKTt0aGlzLmEuYygpO3RoaXMuVmI9ITE7dGhpcy5hYSgpLmVkKCk7dGhpcy5tYSgpfX07dS5wcm90b3R5cGUucGU9ZnVuY3Rpb24oYSl7YSBpbnN0YW5jZW9mIEM/KHRoaXMuc2EoYSksdGhpcy5GKCEwKSk6KCJ2cGFpZGVycm9yIj09YSYmKHRoaXMubygidnBhaWRlcnJvciIpLGcuai5hKHYuZmEsdGhpcy5iKCkpLHRoaXMuRigpKSwidmVydGljYWxpenIiPT1hJiZ0aGlzLkYoKSwiTk9PUFZJREVPIj09YSYmKHRoaXMuUD0hMCx0aGlzLkYoKSksYT09Qy5pJiYKdGhpcy5zYShDLmkpLCJwbGF5cHJvbWlzZUZhaWxlZCIhPWF8fHRoaXMubGF8fHRoaXMuRigpKX07dS5wcm90b3R5cGUuQWU9ZnVuY3Rpb24oKXt0aGlzLmxhfHx0aGlzLk1jKCl9O3UucHJvdG90eXBlLk1jPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LnBsYXkoKTt0aGlzLmFhKCkuamQodGhpcyl9O3UucHJvdG90eXBlLk5jPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkLGU9MDtlPGEubGVuZ3RoO2UrKylkPWcuai5pYShhW2VdKSxjLnB1c2goZCk7YT17aGFzaGVzOmN9O2E9di5hKGEsdGhpcy5xYSgpKTtnLmouWmIoYSl9O3UucHJvdG90eXBlLkY9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7dGhpcy5DJiZ0aGlzLkMuRmQmJnRoaXMuTmModGhpcy5DLkZkKTtpZighdGhpcy5OKWlmKHRoaXMuTj0hMCx0aGlzLkZhfHwoZy5qLmEodi5WLHRoaXMuYigpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSwhdGhpcy5sfHx0aGlzLmwuY3x8dGhpcy5sLmx8fHRoaXMubC5CKXt0aGlzLk49CiExO3RoaXMuZ2ErKzt0cnl7dGhpcy5kaXNwbGF5LnJlbW92ZSgpfWNhdGNoKGMpe310cnl7dGhpcy5zLnJlbW92ZUNoaWxkKHRoaXMuZil9Y2F0Y2goYyl7fXRoaXMubT10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5WPSExO3RyeXt0aGlzLmRpc3BsYXkucGF1c2UoKX1jYXRjaChjKXt9dGhpcy5hLmMoKTt0aGlzLlZiPSExO3RoaXMuYWEoKS5lZCgpO2lmKHRoaXMubCYmdGhpcy5sLndjJiZ0aGlzLmwuYyl0aGlzLmZhKCk7ZWxzZXtpZih0aGlzLmwmJnRoaXMubC5sJiZhKXtpZih0aGlzLmwud2Mpe3RoaXMuZmEoKTtyZXR1cm59aWYodGhpcy5sLkIpe3RoaXMubC5VKCk7cmV0dXJufX10aGlzLnRjKCl9fWVsc2UgdGhpcy50YygpfTt1LnByb3RvdHlwZS5iPWZ1bmN0aW9uKCl7dHJ5e3ZhciBhPU9iamVjdC5hc3NpZ24oe30sdGhpcy5DJiZ0aGlzLkMuYmU/dGhpcy5DLm5jOm51bGwsdGhpcy5hLlMuQ2EoKSx0aGlzLnFiKCksdGhpcy5xYSgpKX1jYXRjaChjKXthPXt9fXJldHVybiBhfTsKdS5wcm90b3R5cGUuU2I9ZnVuY3Rpb24oKXt0aGlzLkpifHwodGhpcy5KYj0hMCx0aGlzLnBhfHxnLmoudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfTt1LnByb3RvdHlwZS5IZD1mdW5jdGlvbihhKXt0aGlzLm9iKCk7YT09dGhpcy5UYXx8dGhpcy5QfHwoMD09YSYmKHRoaXMuQmIoKSx0aGlzLnpiKCksdGhpcy5sYigpKSxhPT1NYXRoLmZsb29yKHRoaXMuQy5kdXJhdGlvbi80KSYmdGhpcy5BYigpLGE9PU1hdGguZmxvb3IodGhpcy5DLmR1cmF0aW9uLzIpJiZ0aGlzLkNiKCksYT09TWF0aC5mbG9vcigzKnRoaXMuQy5kdXJhdGlvbi80KSYmdGhpcy5uYigpLHRoaXMuVGE9YSl9O3UucHJvdG90eXBlLktlPWZ1bmN0aW9uKGEpe2cuai50cmFjaygic3RhdHNfaGRfYWRfc2V0dXAiLGEsITApfTt1LnByb3RvdHlwZS5OZT1mdW5jdGlvbigpe2cuai5ZKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuTygpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX07CnUucHJvdG90eXBlLlBlPWZ1bmN0aW9uKCl7Zy5qLlkoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5PKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfTt1LnByb3RvdHlwZS5PZT1mdW5jdGlvbigpe2cuai5ZKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLk8oKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfTt1LnByb3RvdHlwZS5vPWZ1bmN0aW9uKGEpe2cuai5ZKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9O3UucHJvdG90eXBlLlc9ZnVuY3Rpb24oYSl7KHRoaXMuR2F8fHRoaXMuaS5vKSYmZy5qLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5PKCksITApfTt1LnByb3RvdHlwZS5RYj1mdW5jdGlvbihhKXt0aGlzLmkubyYmZy5qLnRyYWNrKCJzdGF0c19oZF8iK2EsImNvbnRlbnQiLCEwKX07dS5wcm90b3R5cGUuSWQ9ZnVuY3Rpb24oYSxjKXthPU1hdGguZmxvb3IoYSk7aWYoIXRoaXMuRGFbIl8iKwphXSl7dmFyIGQ9dGhpcy5XYSh0aGlzLkMuamEsInByb2dyZXNzIik7dGhpcy5EYVsiXyIrYV09W107Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe3ZhciBmPWRbZV07YT09Zy5qLmdiKGYub2Zmc2V0LGMpJiYodGhpcy5kYShmLnVybCwicHJvZ3Jlc3MiKSx0aGlzLkRhWyJfIithXS5wdXNoKGYpKX19fTt1LnByb3RvdHlwZS50cmFjaz1mdW5jdGlvbihhLGMpe2M9dm9pZCAwPT09Yz8hMTpjO2lmKCJwcm9ncmVzcyIhPWEmJiF0aGlzLlApe3RoaXMud2EmJnRoaXMud2EudHJhY2smJnRoaXMud2EudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZudWxsIT1nLmouZmEmJmcuai50cmFjaygic3RhdHNfaGRfYWR4X2ltcHJlc3Npb24iLGcuai5mYS50b1N0cmluZygpLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7dmFyIGQ9YSsiSGFzQmVlblRyYWNrZWQiO2lmKHRoaXNbZF0pcmV0dXJuO3RoaXNbZF09ITB9ZD1bXTt0cnl7ZD10aGlzLldhKHRoaXMuQy5qYSwKYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGU9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmthPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuaGEuaW1wcmVzc2lvbnMmJmcuai5KYihlLnVybCx0aGlzLmhhLmltcHJlc3Npb25zKT90aGlzLmRhKGUudXJsLGUudHlwZSx7fSxmdW5jdGlvbihmKXt0cnl7dmFyIGg9Zi5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtnLmouYSh2Lm8sdGhpcy5DLm5jLHRoaXMuYS5TLkNhKCksdGhpcy5xYigpLHthZElkOnRoaXMuaGEuYWRJZCxpbXByZXNzaW9uVVJMOmh9LHRoaXMucWEoKSl9Y2F0Y2gobSl7fX0uYmluZCh0aGlzKSk6dGhpcy5kYShlLnVybCxlLnR5cGUpfWNhdGNoKGYpe31pZighYyl0cnl7dGhpcy5DLmphPXRoaXMuWWIodGhpcy5DLmphLGEpfWNhdGNoKGYpe319fTt1LnByb3RvdHlwZS5PPWZ1bmN0aW9uKCl7dmFyIGE9Zy5qLnJhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGM9IiI7Zy5qLnUmJgooYz0iX3JlY3ljbGVkIik7dGhpcy5HYSYmKGM9Il92cGFpZCIpOyJ3ZWxlY3QiPT09dGhpcy5CJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9O3UucHJvdG90eXBlLmRhPWZ1bmN0aW9uKGEsYyxkLGUpe2Q9dm9pZCAwPT09ZD97fTpkO2U9dm9pZCAwPT09ZT9udWxsOmU7dmFyIGY9dm9pZCAwPT09Zj9udWxsOmY7aWYoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCl7dmFyIGg9dGhpcy5pLmMoYSk7ZCYmaC5iKGQpO2V8fChlPXRoaXMueGIpO2Z8fChmPXRoaXMueGIpO2Q9ZnVuY3Rpb24oKXt0aGlzLkxiKGEpO2UoKX0uYmluZCh0aGlzKTt2YXIgbT1mdW5jdGlvbigpe3RoaXMuTGIoYSk7ZigpfS5iaW5kKHRoaXMpO2cuai5iYT8oImltcHJlc3Npb24iIT1jfHx0aGlzLmlifHwodGhpcy5pYj0hMCxjPWcuai5LKCJodHRwczovL2hvbWFkLXZhc3QtaW1wcmVzc2lvbnMuczMuYW1hem9uYXdzLmNvbS93ZWxlY3QuZGUuZ2lmP3NhbHQ9MC4iK2cuai5zKDE2KSxnLkgpLGM9dGhpcy5pLmMoYyksCnRoaXMuaS5sKGMsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSwhMSwhMCkpLChuZXcgSW1hZ2UpLnNyYz1hKToodGhpcy5DYyhhKSx0aGlzLmkubChoLGQsbSwhMSwhMCkpfX07dS5wcm90b3R5cGUuQ2M9ZnVuY3Rpb24oYSl7dGhpcy5LW2FdPSJvcGVuIn07dS5wcm90b3R5cGUuTGI9ZnVuY3Rpb24oYSl7dGhpcy5LW2FdPSJjbG9zZWQifTt1LnByb3RvdHlwZS5aZD1mdW5jdGlvbigpe3RoaXMuSz17fX07dS5wcm90b3R5cGUuUWU9ZnVuY3Rpb24oKXt2YXIgYT0wLGM7Zm9yKGMgaW4gdGhpcy5LKXRoaXMuSy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLktbY10mJmErKztyZXR1cm4gYX07dS5wcm90b3R5cGUuV2E9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIGQudHlwZT09Y30pfTt1LnByb3RvdHlwZS5ZYj1mdW5jdGlvbihhLGMpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gZC50eXBlIT09Y30pfTt1LnByb3RvdHlwZS5PYz0KZnVuY3Rpb24oKXt2YXIgYT10aGlzLmEuUzthLnRkJiZhLnRkKHRoaXMueWIuYmluZCh0aGlzKSl9O3UucHJvdG90eXBlLktkPWZ1bmN0aW9uKCl7aWYoIXRoaXMubSl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5nWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmdbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpOwp0aGlzLmM/YS5pbm5lckhUTUw9IldlcmJ1bmciOmEuaW5uZXJIVE1MPXRoaXMuWi5yZXBsYWNlKCJbdGltZV0iLGcuai53YSgwKSk7dmFyIGM9dGhpcy5nWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5pLlYmJihjPXRoaXMuaS5WKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnUuYmluZCh0aGlzKSwxRTMqYyk7dGhpcy5tPXRoaXMuZi5hcHBlbmRDaGlsZChhKTt0aGlzLmMmJih0aGlzLm0uc3R5bGUudHJhbnNmb3JtT3JpZ2luPSJib3R0b20gY2VudGVyIix0aGlzLm0uc3R5bGUudHJhbnNmb3JtPSJzY2FsZSgxLjUpIix0aGlzLnUoKSl9fTt1LnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7KHRoaXMuZ1siY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLmkuVnx8dGhpcy5jKSYmdGhpcy5tJiZ0aGlzLm0uc3R5bGUmJih0aGlzLm0uc3R5bGUuZGlzcGxheT0ibm9uZSIpfTt1LnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaXNwbGF5LmdldER1cmF0aW9uKCksYz10aGlzLmRpc3BsYXkuZ2V0Q3VycmVudFRpbWUoKTsKdGhpcy5kaXNwbGF5LmwoKXx8YSYmYyYmKHRoaXMuZ1siY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLmkuVnx8dGhpcy5jKSYmdGhpcy5tJiZ0aGlzLm0uc3R5bGUmJih0aGlzLm0uc3R5bGUuZGlzcGxheT0iYmxvY2siKX07dS5wcm90b3R5cGUuTGQ9ZnVuY3Rpb24oKXtpZighZy5qLlcodGhpcy5jb250cm9scykpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLmFlO3RoaXMuZ1siY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuZ1siY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt0aGlzLkcoKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkkoKTt0aGlzLnUoKX0uYmluZCh0aGlzKSk7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5nWyJwbGF5UGF1c2Uuc3R5bGUiXT9kLnN0eWxlPXRoaXMuZ1sicGxheVBhdXNlLnN0eWxlIl06KGQuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZC5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtkLmlkPXRoaXMuemE7ZC5pbm5lckhUTUw9dGhpcy5nLnBhdXNlQnV0dG9uO2QuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUmIuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5SYi5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkcoKTsKdGhpcy5EKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JKCk7dGhpcy51KCl9LmJpbmQodGhpcykpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuZ1sibXV0ZS5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5nWyJtdXRlLnN0eWxlIl06KGUuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGUuc3R5bGVbImZsb2F0Il09InJpZ2h0IixlLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2UuaWQ9dGhpcy50YTtlLmlubmVySFRNTD10aGlzLmcubXV0ZUJ1dHRvbjtlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlJlLmJpbmQodGhpcykpO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuRygpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKTtlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuSSgpOwp0aGlzLnUoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5nWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmdbInNraXAuc3R5bGUiXTp0aGlzLmRpc3BsYXkuRCgpP2cuai5xYShmLHRoaXMuZGlzcGxheS5EKCkpOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5QYjtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgaD1mLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTtoJiZoWzBdJiYoaFswXS5zdHlsZS5vcGFjaXR5PTEpfSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgaD1mLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTsKaCYmaFswXSYmKGhbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGQpO3RoaXMuQy56YyYmYy5hcHBlbmRDaGlsZChmKTtjLmFwcGVuZENoaWxkKGUpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5qLnJhKCl8fCh0aGlzLmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuRygpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKSx0aGlzLmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JKCk7dGhpcy51KCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZi5hcHBlbmRDaGlsZChjKTt0aGlzLmdbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9hLnN0eWxlPXRoaXMuZ1sicmVzdW1lQ29udHJvbC5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0KIiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuekluZGV4PSIxMDAwMCIsYS5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQSYmKHRoaXMuQS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmEuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5BPXRoaXMuZi5hcHBlbmRDaGlsZChhKTt0aGlzLmEuZyhmdW5jdGlvbihoKXt0aGlzLkEuc3R5bGUuaGVpZ2h0PWguaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpO3RoaXMuYyYmKGQuc3R5bGUudHJhbnNmb3JtT3JpZ2luPSJib3R0b20gbGVmdCIsZC5zdHlsZS50cmFuc2Zvcm09InNjYWxlKDEuNSkiLGUuc3R5bGUudHJhbnNmb3JtT3JpZ2luPSJib3R0b20gcmlnaHQiLGUuc3R5bGUudHJhbnNmb3JtPSJzY2FsZSgxLjUpIik7dGhpcy5hLlMuRWEmJiF0aGlzLmMmJnRoaXMuYS5TLkVhKCkmJihnLmouYSh2LkksdGhpcy5iKCkpLHRoaXMuSWIoKSk7dGhpcy5JKCl9fTt1LnByb3RvdHlwZS5JPWZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn07dS5wcm90b3R5cGUuRz1mdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMuQSYmImJsb2NrIj09dGhpcy5BLnN0eWxlLmRpc3BsYXl8fAp0aGlzLlV8fHRoaXMuZGlzcGxheS5sKCl8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9O3UucHJvdG90eXBlLlJiPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmlzUGF1c2VkKCk/KHRoaXMuZGlzcGxheS5wbGF5KCksdGhpcy5vYSgpKToodGhpcy5kaXNwbGF5LnBhdXNlKCksdGhpcy5uYSgpKX07dS5wcm90b3R5cGUuamM9ZnVuY3Rpb24oKXtpZighdGhpcy5kaXNwbGF5LmlzUGF1c2VkKCl8fHRoaXMuYyl0aGlzLmRpc3BsYXkucGF1c2UoKSx0aGlzLm5hKCl9O3UucHJvdG90eXBlLk1iPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmlzUGF1c2VkKCkmJih0aGlzLmRpc3BsYXkucGxheSgpLHRoaXMub2EoKSl9O3UucHJvdG90eXBlLlJlPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmViKCk/KHRoaXMuZGlzcGxheS4kYSgpLHRoaXMucGIoKSk6KHRoaXMuZGlzcGxheS5YYSgpLHRoaXMuRGIoKSl9O3UucHJvdG90eXBlLkliPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmViKCl8fAoodGhpcy5kaXNwbGF5LlhhKCksdGhpcy5EYigpKX07dS5wcm90b3R5cGUuSmQ9ZnVuY3Rpb24oKXt0aGlzLmRpc3BsYXkuZWIoKSYmKHRoaXMuZGlzcGxheS4kYSgpLHRoaXMucGIoKSl9O3UucHJvdG90eXBlLnRjPWZ1bmN0aW9uKCl7aWYodGhpcy5nYigpKWlmKHRoaXMuaGIoKSl7aWYoZy5qLnRyYWNrKCJzdGF0c19oZF9iYWNrZmlsbF9hbGxvd2VkIiwid2VsZWN0IiwhMCksdGhpcy5UYigpKXt0aGlzLk49ITE7cmV0dXJufX1lbHNlIHRoaXMuVmQoKT9nLmoudHJhY2soInN0YXRzX2hkX2JhY2tmaWxsX2FsbG93ZWQiLCJ2ZXJ0aWNhbGl6ciIsITApOmcuai50cmFjaygic3RhdHNfaGRfYmFja2ZpbGxfYWxsb3dlZCIsIm5vbmUiLCEwKTtlbHNlIGcuai50cmFjaygic3RhdHNfaGRfYmFja2ZpbGxfYWxsb3dlZCIsImZhbHNlIiwhMCk7dGhpcy5sYT0hMDt0aGlzLm1hKCl9O3UucHJvdG90eXBlLmdiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5pLkd8fGcuai5HYigpLGM9KCF0aGlzLmthfHwKdGhpcy56ZSgpKSYmIXRoaXMuQixkPWcuai5GYigpLGU9InByZXJvbGwiPT09Zy5qLlU7cmV0dXJuIGEmJmMmJmQmJmV9O3UucHJvdG90eXBlLmhiPWZ1bmN0aW9uKCl7dmFyIGE9Zy52LmIoImFkX2ZhbGxiYWNrIik7YT1nLkguaWEmJmEmJmEudXJsO3ZhciBjPSFnLmoucmEoKTtyZXR1cm4gYSYmY307dS5wcm90b3R5cGUuVmQ9ZnVuY3Rpb24oKXtyZXR1cm4gZy5qLkYoKS5yYSYmZy5qLk4oKX07dS5wcm90b3R5cGUuemU9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHRoaXMuZGlzcGxheSYmMT50aGlzLmRpc3BsYXkuZ2V0RHVyYXRpb24oKSYmNT09PXRoaXMuQy5kdXJhdGlvbn1jYXRjaChhKXtyZXR1cm4hMX19O3UucHJvdG90eXBlLndlPWZ1bmN0aW9uKCl7dmFyIGE9Zy52LmIoImFkX2ZhbGxiYWNrIiksYz1nLmouYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsoYT1hP2EudXJsOm51bGwpfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0X3Rlc3QueG1sIik7CnJldHVybiBhfTt1LnByb3RvdHlwZS5UYj1mdW5jdGlvbigpe3ZhciBhPXRoaXMud2UoKTt0aGlzLkI9IndlbGVjdCI7dGhpcy5VPXRoaXMua2E9ITA7cmV0dXJuIGEmJihnLmoudHJhY2soInN0YXRzX2hkX2JhY2tmaWxsX3N0YXJ0Iiwid2VsZWN0IiwhMCksYT1nLkgubWEoYSksYT1nLmouSyhhLHRoaXMuaSwhMSx7b25seVVSTDohMH0pKT8odGhpcy5lYShhLCEwLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwKTohMX07dS5wcm90b3R5cGUubWE9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7dGhpcy5RZSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoITApfS5iaW5kKHRoaXMpLDIwMCk6KHRoaXMuZGlzcGxheSYmKHRoaXMuZGlzcGxheS5wYXVzZSgpLHRoaXMuYyYmdGhpcy5kaXNwbGF5JiZ0aGlzLmRpc3BsYXkucmVtb3ZlKCkpLHRoaXMuYS5jKCksdGhpcy5hLkcoKSx0aGlzLlZiPSExLGcuai5hKHYuSyx0aGlzLmIoKSksdGhpcy5hYSgpLmVkKCkpfTsKdS5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLlMmJihhPXRoaXMuYS5TKTtyZXR1cm4gYX07dS5wcm90b3R5cGUuamI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlpiKCk7YSYmKGcuai5GYSh0aGlzLnZpZGVvLGEpP3RoaXMuTWIoKTp0aGlzLmpjKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpiKCl9LmJpbmQodGhpcyksMTAwKSl9O3UucHJvdG90eXBlLnFiPWZ1bmN0aW9uKCl7dmFyIGE9e307aWYodGhpcy5DKXthLmNsaWNrdGhyb3VnaD10aGlzLkMuVWI7YS5kdXJhdGlvbj10aGlzLkMuZHVyYXRpb247YS5hZFBvZD10aGlzLkMuc2Q7dmFyIGM9dGhpcy5kaXNwbGF5O2MmJihhLmN1cnJlbnRUaW1lPWMuZ2V0Q3VycmVudFRpbWUoKSxhLnZpZGVvX2R1cmF0aW9uPXRoaXMuZGlzcGxheS5nZXREdXJhdGlvbigpKTt0aGlzLlkmJjA8dGhpcy5ZLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5ZKX1yZXR1cm4gYX07dS5wcm90b3R5cGUucWE9CmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5YZCsiLSIrdGhpcy5nYTt0aGlzLkMmJnRoaXMuQy56ZCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLkMuemQoKSk7cmV0dXJuIGF9O3UucHJvdG90eXBlLnhiPWZ1bmN0aW9uKCl7fTt5KFAsdmEpO1AucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07UC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7fTtQLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiAwfTtQLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiAwfTtQLnByb3RvdHlwZS5sPWZ1bmN0aW9uKCl7cmV0dXJuITF9O1AucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt9O1AucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7fTtQLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3JldHVybiExfTtQLnByb3RvdHlwZS5YYT1mdW5jdGlvbigpe307UC5wcm90b3R5cGUuJGE9ZnVuY3Rpb24oKXt9OwpQLnByb3RvdHlwZS5lYj1mdW5jdGlvbigpe3JldHVybiExfTtQLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXt9O1AucHJvdG90eXBlLnNiPWZ1bmN0aW9uKCl7fTtQLnByb3RvdHlwZS5GZT1mdW5jdGlvbihhKXt0aGlzLkc9YX07UC5wcm90b3R5cGUucGE9ZnVuY3Rpb24oKXt2YXIgYT0hMDstMT09PXRoaXMuRyYmKGE9ITEpO3JldHVybiBhfTtQLnByb3RvdHlwZS5oZD1mdW5jdGlvbihhKXt0aGlzLmk9YX07UC5wcm90b3R5cGUuRWU9ZnVuY3Rpb24oYSl7dGhpcy5jPWF9O1AucHJvdG90eXBlLlhjPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY307UC5wcm90b3R5cGUuQmU9ZnVuY3Rpb24oYSl7dGhpcy5DPWF9O1AucHJvdG90eXBlLmRhPWZ1bmN0aW9uKCl7fTtQLnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7cmV0dXJuIiJ9O1AucHJvdG90eXBlLkI9ZnVuY3Rpb24oKXtyZXR1cm4hMX07UC5wcm90b3R5cGUuRGU9ZnVuY3Rpb24oYSl7dGhpcy5XPWF9O3koTSxQKTtNLnByb3RvdHlwZS5UPQpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLlUoKSxjPXRoaXMuaTt0aGlzLmthKGEpO2EucHJlbG9hZD0iYXV0byI7Zy52LmIoInZpZGVvLnN0eWxlLnBvc2l0aW9uIikmJihhLnN0eWxlLnBvc2l0aW9uPWcudi5iKCJ2aWRlby5zdHlsZS5wb3NpdGlvbiIpKyIiKTtnLnYuYigidmlkZW8uc3R5bGUiKSYmKGEuc3R5bGU9Zy52LmIoInZpZGVvLnN0eWxlIikrIiIpO3ZhciBkPWcudi5iKCJ2aWRlby5hdHRyaWJ1dGVzIik7aWYoZClmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhLnNldEF0dHJpYnV0ZShlLGRbZV0pO3RoaXMucGEoKSYmKGEudm9sdW1lPXRoaXMuRyk7Zy5qLlNiKGEpO3RoaXMubmEoKTt0aGlzLm0oYSk/KGEubG9hZCgpLHRoaXMubWEoKSxjLmcodGhpcy5yZXNpemUuYmluZCh0aGlzKSkpOnRoaXMuTCh0aGlzLmV2ZW50Lk9hLG5ldyBDKEMuaSkpO1AucHJvdG90eXBlLlQuY2FsbCh0aGlzKX1jYXRjaChmKXtyZXR1cm4hMX1yZXR1cm4hMH07TS5wcm90b3R5cGUucmVtb3ZlPQpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO2EucGF1c2UoKTthLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSl9O00ucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5SKCkucGF1c2UoKX07TS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SKCkucGF1c2VkfHx0aGlzLkl9O00ucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlIoKS5wbGF5KCk7aWYoYSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5iYT90aGlzLkwodGhpcy5ldmVudC5PYSwicGxheXByb21pc2VGYWlsZWQiKToodGhpcy5JPSEwLHRoaXMucGF1c2UoKSx0aGlzLkwodGhpcy5ldmVudC5IYyksdGhpcy5iYT0hMCl9LmJpbmQodGhpcykpO3NjPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsCnRoaXMuYi5iaW5kKHRoaXMpKSk6TWI9ZnVuY3Rpb24oKXt2YXIgYz10aGlzLlIoKTt0aGlzLkt8fChjLmxvYWQoKSx0aGlzLnBsYXkoKSl9LmJpbmQodGhpcyl9O00ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7dGhpcy5SKCkubXV0ZWQ9ITB9O00ucHJvdG90eXBlLiRhPWZ1bmN0aW9uKCl7dGhpcy5SKCkubXV0ZWQ9ITF9O00ucHJvdG90eXBlLmViPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUigpLm11dGVkfTtNLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlIoKS5jdXJyZW50VGltZX07TS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SKCkuZHVyYXRpb259O00ucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXtyZXR1cm4hMX07TS5wcm90b3R5cGUubWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9dGhpcy5SKCk7Yy5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKGQpe2EuRGEoZCl9KTtjLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwKZnVuY3Rpb24oZCl7YS5oYShkKX0pO2MuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oZCl7YS5JPSExO2EuR2EoZCl9KTtjLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIixmdW5jdGlvbihkKXthLmZhKGQpfSk7Yy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oZCl7YS5nYShkKX0pO2Muc3R5bGUmJihjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGQpe3RyeXtkLmN1cnJlbnRUYXJnZXQucGF1c2VkP2EucGxheSgpOmEuZWEoKX1jYXRjaChlKXthLmVhKCl9fSl9O00ucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLlIoKTtjLnN0eWxlLndpZHRoPWEud2lkdGgrInB4IjtjLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifTtNLnByb3RvdHlwZS5mYT1mdW5jdGlvbihhKXt0aGlzLnJlbW92ZSgpO3RoaXMuTCh0aGlzLmV2ZW50Lk5hLGEpfTtNLnByb3RvdHlwZS5HYT0KZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5SKCk7Yy5jb250cm9scz0hMTt0aGlzLks9ITA7YS5jdXJyZW50VGltZT1jLmN1cnJlbnRUaW1lO2EuZGlzcGxheT10aGlzOzA8Yy5kdXJhdGlvbiYmdGhpcy5MKHRoaXMuZXZlbnQub2MsYSl9O00ucHJvdG90eXBlLkRhPWZ1bmN0aW9uKGEpe3RoaXMuZnx8KHRoaXMuUigpLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mfHx0aGlzLmhhKGEpfS5iaW5kKHRoaXMpLHRoaXMuaWEpKX07TS5wcm90b3R5cGUuaGE9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5DLGQ9dGhpcy5SKCk7dGhpcy5QfHwhdGhpcy5tKGQpfHx0aGlzLkF8fHRoaXMuZnx8KHRoaXMuUD0hMCwhZy5qLnJhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyhjLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKT8odGhpcy5BfHwodGhpcy5BPSEwLGcuSC5pYnx8Zy5ILkFhKCJ2aWRlby1ub29wIikpLHRoaXMuTCh0aGlzLmV2ZW50Lk9hLAoiTk9PUFZJREVPIikpOihkLmNvbnRyb2xzPSExLHRoaXMuTCh0aGlzLmV2ZW50LlhiKSkpfTtNLnByb3RvdHlwZS5uYT1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlIoKSxjPXRoaXMubGEoKSxkPTA7ZDxjLmxlbmd0aDtkKyspYS5jYW5QbGF5VHlwZShjW2RdLnR5cGUpJiZ0aGlzLnUoYSxjW2RdLnVybCsiIil9O00ucHJvdG90eXBlLmxhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DLmEsYz1OdW1iZXIoZy52LmIoImJpdHJhdGUiKSl8fDFFMzt0cnl7dmFyIGQ9YS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuLTEhPWYudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gTWF0aC5hYnMoYy1mLmJpdHJhdGUpLU1hdGguYWJzKGMtaC5iaXRyYXRlKX0pLGU9YS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuLTE9PWYudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gTWF0aC5hYnMoYy1mLmJpdHJhdGUpLU1hdGguYWJzKGMtCmguYml0cmF0ZSl9KTthPWQuY29uY2F0KGUpfWNhdGNoKGYpe31yZXR1cm4gYX07TS5wcm90b3R5cGUudT1mdW5jdGlvbihhLGMpe3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Quc3JjPWM7ZC5vbmVycm9yPXRoaXMuRmEuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGQpfTtNLnByb3RvdHlwZS5GYT1mdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt2YXIgYz10aGlzLlIoKTtjLm5ldHdvcmtTdGF0ZSYmYy5uZXR3b3JrU3RhdGU9PT1jLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKGEpfTtNLnByb3RvdHlwZS5lYT1mdW5jdGlvbigpe3RoaXMuTCh0aGlzLmV2ZW50LmxjKX07TS5wcm90b3R5cGUuZ2E9ZnVuY3Rpb24oYSl7dGhpcy5mPSEwO3ZhciBjPXt9O2lmKGEmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZSlzd2l0Y2goYS50YXJnZXQuZXJyb3IuY29kZSl7Y2FzZSBhLnRhcmdldC5lcnJvci5NRURJQV9FUlJfQUJPUlRFRDpjPQpDLmEubWM7YnJlYWs7Y2FzZSBhLnRhcmdldC5lcnJvci5NRURJQV9FUlJfTkVUV09SSzpjPUMuYS5tYzticmVhaztjYXNlIGEudGFyZ2V0LmVycm9yLk1FRElBX0VSUl9ERUNPREU6Yz1DLmEubWM7YnJlYWs7Y2FzZSBhLnRhcmdldC5lcnJvci5NRURJQV9FUlJfU1JDX05PVF9TVVBQT1JURUQ6Yz1DLmEubWN9ZWxzZSB0aGlzLnZpZGVvVGFnLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlb1RhZy5ORVRXT1JLX05PX1NPVVJDRSYmZy5ILkpiKCk7dGhpcy5MKHRoaXMuZXZlbnQuT2EsbmV3IEMoQy5tLHtkZXRhaWxzOmMsZXJyb3I6YX0pKX07TS5wcm90b3R5cGUuc2I9ZnVuY3Rpb24oYSl7YS5hcHBlbmRDaGlsZCh0aGlzLlIoKSl9O00ucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofTtNLnByb3RvdHlwZS5rYT1mdW5jdGlvbihhKXt0aGlzLnZpZGVvVGFnPWF9O00ucHJvdG90eXBlLlI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ307Ck0ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXt2YXIgYT1iYi5wb3AoKTthfHwoYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLGEuaWQ9Zy5qLmcoMTApLGEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTtyZXR1cm4gYX07TS5wcm90b3R5cGUuYj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuYik7dGhpcy5LfHwoYS5sb2FkKCksYS5wbGF5KCkpfTtmb3IodmFyIGJiPVtdLHhjPTA7MTAwPnhjO3hjKyspe3ZhciBPYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO09iLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPYi5pZD1nLmouZygxMCk7T2IuY29udHJvbHM9ITA7YmIucHVzaChPYil9dmFyIE1iPW51bGwsc2M9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKSmEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEphKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsSmEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsSmEpO3kob2EsTSk7b2EucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLlk/dGhpcy5WKCk6dGhpcy56YSgpfTtvYS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3RoaXMucWEoKTtNLnByb3RvdHlwZS5wbGF5LmNhbGwodGhpcyl9O29hLnByb3RvdHlwZS56YT1mdW5jdGlvbigpe3RoaXMuWT0hMDt0aGlzLlo9dGhpcy5jLnN0eWxlLnpJbmRleDt0aGlzLmMuc3R5bGUuekluZGV4PSIxMDAwIjt0aGlzLm9hKCl9O29hLnByb3RvdHlwZS5xYT1mdW5jdGlvbigpe2lmKHRoaXMuYSl0cnl7b2EuYSgpLHRoaXMuYy5zdHlsZS56SW5kZXg9dGhpcy5aLHRoaXMuYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYSl9Y2F0Y2goYSl7fX07b2EucHJvdG90eXBlLnNiPWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLnNiLmNhbGwodGhpcywKYSk7dGhpcy5zPWF9O29hLnByb3RvdHlwZS53YT1mdW5jdGlvbihhKXt0aGlzLmEuc3R5bGUud2lkdGg9YS53aWR0aCsicHgiO3RoaXMuYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In07b2EucHJvdG90eXBlLm9hPWZ1bmN0aW9uKCl7dGhpcy5pLmcodGhpcy53YS5iaW5kKHRoaXMpKTt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnN0eWxlLnpJbmRleD0xRTY7YS5zdHlsZS53aWR0aD0iIjthLnN0eWxlLmhlaWdodD0iIjthLnN0eWxlLmxlZnQ9IjBweCI7YS5zdHlsZS50b3A9IjBweCI7YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Euc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjZmZmIjthLmlubmVySFRNTD10aGlzLk87dGhpcy5hPWE7dGhpcy5zLmFwcGVuZENoaWxkKHRoaXMuYSl9O29hLnByb3RvdHlwZS50YT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7ZmV0Y2goImh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vc3BpZWdlbFNuaXBwZXQuaHRtbCIpLnRoZW4oZnVuY3Rpb24oYyl7Yy50ZXh0KCkudGhlbihmdW5jdGlvbihkKXthLk89CmQ7YS5zYSgpfSl9KX07b2EucHJvdG90eXBlLnNhPWZ1bmN0aW9uKCl7dmFyIGE9Zy5qLmcoMTApO3dpbmRvd1thXT1mdW5jdGlvbigpe3RoaXMuVigpfS5iaW5kKHRoaXMpO3RoaXMuTz10aGlzLk8ucmVwbGFjZSgiW09OQ0xJQ0tIQU5ETEVSXSIsIndpbmRvd1snIithKyInXSgpIil9O29hLlJhPWZ1bmN0aW9uKCl7Zy5wYz0hMH07b2EuYT1mdW5jdGlvbigpe2cucGM9ITF9OzA8PXdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoInN2bXB1ciIpJiZvYS5SYSgpO3koT2EsTSk7T2EucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXtNLnByb3RvdHlwZS5ULmNhbGwodGhpcyk7cmV0dXJuITB9O09hLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYyl7YSYmYS5hcHBlbmRDaGlsZD9NLnByb3RvdHlwZS51LmNhbGwodGhpcyxhLGMpOmEuc2V0QXR0cmlidXRlKCJzcmMiLGMpfTtPYS5wcm90b3R5cGUubT1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZT9NLnByb3RvdHlwZS5tLmNhbGwodGhpcywKYSk6ITB9O09hLnByb3RvdHlwZS5VPWZ1bmN0aW9uKCl7dGhpcy5hLmxvYWQoKTtyZXR1cm4gdGhpcy5hfTtPYS5wcm90b3R5cGUucz1mdW5jdGlvbihhKXt0aGlzLmE9YX07T2EucHJvdG90eXBlLnNiPWZ1bmN0aW9uKCl7fTtPYS5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7dGhpcy5MKHRoaXMuZXZlbnQuTmEsYSl9O09hLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oYSl7aWYoMCE9YS53aWR0aCYmMCE9YS5oZWlnaHQpe3ZhciBjPXRoaXMuUigpO2Muc3R5bGUud2lkdGg9YS53aWR0aCsicHgiO2Muc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9fTt5KFcsUCk7Vy5wcm90b3R5cGUuVD1mdW5jdGlvbigpe2cuai5nYSgpO3ZhciBhPShnLmoubC5nZXQoImNyZWF0ZUVsZW1lbnQiKXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkoImlmcmFtZSIpO3RoaXMuSShhKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwKIm5vIik7YS5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTthLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt2YXIgYz1nLnYuYigidnBhaWRJZnJhbWUuc3R5bGUiKTtjJiZnLmoucWEoYSxjKyIiKTthLm9ubG9hZD10aGlzLlUuYmluZCh0aGlzKTtjPWcuai5LKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsZy5ILCEwKTthLnNyYz1jO2cuai5aKCJ2cGFpZGV2ZW50Iix0aGlzLnUuYmluZCh0aGlzKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkwodGhpcy5ldmVudC5YYil9LmJpbmQodGhpcyksMCk7dGhpcy5ZKCk7cmV0dXJuITB9O1cucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYSxjPQphLnBhcmVudE5vZGU7YSYmYyYmZy5qLlcoYSkmJmMucmVtb3ZlQ2hpbGQoYSk7dGhpcy5JKG51bGwpO2cuai5nYSgpfTtXLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLkF9O1cucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc307Vy5wcm90b3R5cGUubD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm19O1cucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbnRyb2wiLCJwbGF5Iik7dGhpcy5iPSExfTtXLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe2cuai5mKHRoaXMuYSwiY29udHJvbCIsInBhdXNlIik7dGhpcy5iPSEwfTtXLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ9O1cucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLCJjb250cm9sIiwibXV0ZSIpO3RoaXMuZj0hMH07Vy5wcm90b3R5cGUuJGE9ZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsCiJjb250cm9sIiwidW5tdXRlIik7dGhpcy5mPSExfTtXLnByb3RvdHlwZS5lYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZ9O1cucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihhKXtnLmouZih0aGlzLmEsInJlc2l6ZSIse3dpZHRoOmEud2lkdGgsaGVpZ2h0OmEuaGVpZ2h0fSl9O1cucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGMsZCxlLGYsaCxtLEQsTCxPO3JldHVybiBGYyhmdW5jdGlvbihOKXtpZigxPT1OLmEpe2M9YS5pO2Q9ITE7Yy5TLkVhJiZjLlMuRWEoKSYmKGQ9ITApO2U9YS5DLnMoKTtmPWEuQy5uYztlJiZlLnVybCYmMDw9ZS51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJihnLkguZ2V0Q29uZmlnKCksKGg9Zy52LmIoImFkX2ZhbGxiYWNrX2NvbmZpZyIpKSYmaC53ZWxlY3RhbGlhcyYmKGY9SlNPTi5zdHJpbmdpZnkoaCkpKTttPWEuWGMoKTtpZighZy5qLkEoZS51cmwpKXtEPWUudXJsO04uYT0yO3JldHVybn1yZXR1cm4gcWMoTixnLmoua2EoZS51cmwpLAozKX0yIT1OLmEmJihEPU4uYik7TD1EO089e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZy5ILmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpMLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmUuZGVzaXJlZEJpdHJhdGV8fGUuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpmLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmZ9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KG0uc3R5bGUud2lkdGgsMTApLGhlaWdodDpwYXJzZUludChtLnN0eWxlLmhlaWdodCwxMCl9fSxjb250ZW50UGxheWVyOnttdXRlZDpkfX07YS5WKE8pO2cuai5aKCIiLGEudS5iaW5kKGEpKTtnLmouWigidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5MKHRoaXMuZXZlbnQuTmEpfS5iaW5kKGEpKTtnLmouWigidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLkwodGhpcy5ldmVudC5OYSl9LmJpbmQoYSkpO2MuZyhmdW5jdGlvbihtYSl7Zy5qLmYodGhpcy5hLAoicmVzaXplIixtYSl9LmJpbmQoYSkpO04uYT0wfSl9O1cucHJvdG90eXBlLnU9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5pO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpeyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiZjLm8oITApO3RoaXMuSz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMuTCh0aGlzLmV2ZW50LkZjKTsiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuTCh0aGlzLmV2ZW50LkRjKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuTCh0aGlzLmV2ZW50LkpjKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MKHRoaXMuZXZlbnQuRWMpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5MKHRoaXMuZXZlbnQuR2MpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiYKdGhpcy5MKHRoaXMuZXZlbnQuS2MpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MKHRoaXMuZXZlbnQuTmEpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMucmVtb3ZlKCksdGhpcy5MKHRoaXMuZXZlbnQuTmEpKTsiQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuTCh0aGlzLmV2ZW50Lm9kKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJih0aGlzLmJhKGEuZGF0YS50aW1pbmcpLHRoaXMuTCh0aGlzLmV2ZW50LnBkLGEpLHRoaXMuYj0hMSk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe2M9YS5kYXRhLmNsaWNrVGhydVRhcmdldDt2YXIgZD10aGlzLkM7Y3x8KGM9ZC5VYik7aWYoIWMpcmV0dXJuO3RoaXMuTCh0aGlzLmV2ZW50LmxjKX0iQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYj0hMCx0aGlzLkwodGhpcy5ldmVudC5IYykpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuYj0hMSx0aGlzLkwodGhpcy5ldmVudC5uZCkpOwoiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5mPSEwLHRoaXMuTCh0aGlzLmV2ZW50Lk1kKSk6KHRoaXMuZj0hMSx0aGlzLkwodGhpcy5ldmVudC5SZCkpKTsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiYoYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLCFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZywoZD1jLm1hdGNoKGQpKT9kLmpvaW4mJihjPWQuam9pbigiLSIpKTpjPWMuc3Vic3RyaW5nKDAsMjApKSx0aGlzLnJlbW92ZSgpLHRoaXMuTCh0aGlzLmV2ZW50Lk9hLCJ2cGFpZGVycm9yIixjKSk7ImJsb2NrQ29udHJvbHMiPT1hLmRhdGEubmFtZSYmKHRoaXMubT0hMCk7InVuYmxvY2tDb250cm9scyI9PWEuZGF0YS5uYW1lJiYodGhpcy5tPSExKX19O1cucHJvdG90eXBlLmJhPWZ1bmN0aW9uKGEpe2EmJih0aGlzLnM9CmEuZHVyYXRpb24sdGhpcy5BPWEuY3VycmVudFRpbWUsdGhpcy5PPWEucmVtYWluaW5nVGltZSl9O1cucHJvdG90eXBlLlY9ZnVuY3Rpb24oYSl7Zy5qLmYodGhpcy5hLCJjb25maWciLGEpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLCJjb25maWciLGEpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2cuai5mKHRoaXMuYSwiY29uZmlnIixhKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLCJjb25maWciLGEpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2cuai5mKHRoaXMuYSwKImNvbmZpZyIsYSl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2cuai5mKHRoaXMuYSwiY29uZmlnIixhKX0uYmluZCh0aGlzKSw1RTMpfTtXLnByb3RvdHlwZS5zYj1mdW5jdGlvbihhKXthLmFwcGVuZENoaWxkKHRoaXMuYSl9O1cucHJvdG90eXBlLkk9ZnVuY3Rpb24oYSl7dGhpcy5hPWF9O1cucHJvdG90eXBlLlk9ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5QKX07Vy5wcm90b3R5cGUuUD1mdW5jdGlvbihhKXthJiZhLmRhdGEmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiYiaW50ZXJ2ZW50aW9uIj09YS5kYXRhLmV2ZW50JiZnLmoudHJhY2soInN0YXRzX2hkX2ludGVydmVudGlvbiIsCmEuZGF0YS5pZCwhMCl9O3koUixQKTtSLnByb3RvdHlwZS5jb250aW51ZT1mdW5jdGlvbigpe3RoaXMubSYmKHRoaXMuTygpLHRoaXMudSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JKCl9LmJpbmQodGhpcyksMCkpfTtSLnByb3RvdHlwZS5aYT1mdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMuVztkJiZkLnZkJiZkLnZkKGEsYyl9O1IucHJvdG90eXBlLmRhPWZ1bmN0aW9uKCl7Zy5qLnRyYWNrKCJ2cnRjbHpyX3NraXBlZCIsIiIsITApO3RoaXMuWmEoInNraXAiLHt9KX07Ui5wcm90b3R5cGUudT1mdW5jdGlvbigpe3RyeXtoaXN0b3J5LnB1c2hTdGF0ZSh7dmVydGljYWw6ITB9LCIiLCIjIitnLmouZyg1KSksaGlzdG9yeS5wdXNoU3RhdGUoe3ZlcnRpY2FsOiEwfSwiIiwiIyIrZy5qLmcoNSkpfWNhdGNoKGEpe313aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLGZ1bmN0aW9uKGEpe2EmJmEuc3RhdGUmJmEuc3RhdGUudmVydGljYWwmJnRoaXMuYS5jbG9zZSgpfS5iaW5kKHRoaXMpKX07ClIucHJvdG90eXBlLkQ9ZnVuY3Rpb24oKXtyZXR1cm4icG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiBjYWxjKDE4JSk7IGJvdHRvbTogOXB4OyB3aWR0aDogNjQlOyB0ZXh0LWFsaWduOiBjZW50ZXI7In07Ui5wcm90b3R5cGUuQj1mdW5jdGlvbihhKXthPWEucmVwbGFjZSgiU2tpcCBBZCIsIldlcmJ1bmcgJnV1bWw7YmVyc3ByaW5nZW4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLzxkaXYgc3R5bGU9IlthLXpBLVowLTk6O1wuXHNcKFwpXC0sI10qIi9naSwnPGRpdiBzdHlsZT0id2lkdGg6MTAwJTsgaGVpZ2h0OiAzMHB4OyBmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFJvYm90bywgYXJpYWwsIHNhbnMtc2VyaWY7IG9wYWNpdHk6IDAuNjsgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgbGluZS1oZWlnaHQ6IDMwcHg7IicpfTtSLnByb3RvdHlwZS5JPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpOwphLmhyZWY9dGhpcy5zLmNzc3x8Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3ZlcnRpY2FsaXpyL3ZlcnRpY2FsaXpyLmNzcyI7YS5yZWw9InN0eWxlc2hlZXQiO2EudHlwZT0idGV4dC9jc3MiO2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYSk7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vdmVydGljYWxpenIvc3dpcGUubWluLmpzIjthLnR5cGU9InRleHQvamF2YXNjcmlwdCI7YS5vbmxvYWQ9ZnVuY3Rpb24oKXt0aGlzLks9ITA7dGhpcy5WKCl9LmJpbmQodGhpcyk7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhKX07Ui5wcm90b3R5cGUuVT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYztGYyhmdW5jdGlvbihkKXtpZigxPT1kLmEpcmV0dXJuIGcudi5jbGllbnQudGNmX2NvbmZpZz0hMCxxYyhkLGcuai5mYihnLkgubWEoYS5QKSksMik7Yz1kLmI7ZmV0Y2goYyx7Y3JlZGVudGlhbHM6ImluY2x1ZGUifSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5qc29uKCl9KS50aGVuKGZ1bmN0aW9uKGUpe2UuYWR2ZXJ0aXNlbWVudHMmJgoxPGUuYWR2ZXJ0aXNlbWVudHMubGVuZ3RoPyhhLkwoYS5ldmVudC5YYiksYS5iPWUuYWR2ZXJ0aXNlbWVudHMsZy5qLnRyYWNrKCJ2cnRjbHpyX3N1Y2Nlc3MiLCIiLCEwKSxhLm0/YS5tKCk6YS5JKCkpOihlLnJlYXNvbj8iaW5zdWZmaWNpZW50X2FkcyI9PT1lLnJlYXNvbj9nLmoudHJhY2soInZydGNsenJfZXJyb3IiLCJpbnN1ZmZpY2llbnRfYWRzIiwhMCk6Im9iamVjdCI9PT10eXBlb2YgZS5yZWFzb24mJmUucmVhc29uLmhhc093blByb3BlcnR5KCJhdmFpbGFibGUiKSYmZy5qLnRyYWNrKCJ2cnRjbHpyX2Vycm9yIiwidW5hdmFpbGFibGUiLCEwKTpnLmoudHJhY2soInZydGNsenJfZXJyb3IiLCJ1bmtub3duIiwhMCksYS5mKCksYS5MKGEuZXZlbnQuT2EsInZlcnRpY2FsaXpyIiksYS5aYSgiZXJyb3IiLHt9KSl9KS5jYXRjaChmdW5jdGlvbigpe2cuai50cmFjaygidnJ0Y2x6cl9lcnJvciIsImFwaSIsITApO2EuZigpO2EuTChhLmV2ZW50Lk9hLCJ2ZXJ0aWNhbGl6ciIpO2EuWmEoImVycm9yIiwKe30pfSk7ZC5hPTB9KX07Ui5wcm90b3R5cGUuUmM9ZnVuY3Rpb24oKXt0aGlzLmEucGxheWVyLnRyYWNrKCJjbGlja3RyYWNraW5nIik7dmFyIGE9dGhpcy5hLmEud2Q7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7dmFyIGM9d2luZG93Lm9wZW4oIiIsIl90b3AiKTtjLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yy5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWF9Y2F0Y2goZCl7Yz13aW5kb3cub3BlbihhLCJfdG9wIik7dHJ5e2N8fHdpbmRvdy5vcGVuKGEsIl90b3AiKX1jYXRjaChlKXt3aW5kb3cub3BlbihhLCJfdG9wIil9fX0uYmluZCh0aGlzKSw1MDApfTtSLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPVtdO3RoaXMuYi5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPW5ldyBWKCIiLCEwKTtkLmNvbnRlbnRfcGllY2VzPWQuY29udGVudF9waWVjZXMuc29ydChmdW5jdGlvbihmKXtyZXR1cm4tMT09PWYucmF0aW8uaW5kZXhPZigiOToxNiIpPwoxOi0xfSk7ZC5zcmM9ZC5jb250ZW50X3BpZWNlc1swXS5yZXNvdXJjZTtjLnB1c2goZS5iYShkLnNyYysiJnByZWZldGNoPXRydWUiKSl9KTtQcm9taXNlLmFsbChjLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZC5jYXRjaChmdW5jdGlvbihlKXtyZXR1cm4gZX0pfSkpLnRoZW4oZnVuY3Rpb24oZCl7YS5iLmZvckVhY2goZnVuY3Rpb24oaCxtKXtkW21daW5zdGFuY2VvZiBWJiYoaC52YXN0X2RhdGE9ZFttXSl9KTtpZihhLmIuZmlsdGVyKGZ1bmN0aW9uKGgpe3JldHVybiFoLmhhc093blByb3BlcnR5KCJ2YXN0X2RhdGEiKX0pKWZvcih2YXIgZT1hLmIuZmlsdGVyKGZ1bmN0aW9uKGgpe3JldHVybiFoLmhhc093blByb3BlcnR5KCJ2YXN0X2RhdGEiKX0pLGY9MDtmPGUubGVuZ3RoO2YrKylnLmoudHJhY2soInZydGNsenJfbm92YXN0IixlWzBdLmlkLnRvU3RyaW5nKCksITApO2EuYi5maWx0ZXIoZnVuY3Rpb24oaCl7cmV0dXJuIGgudmFzdF9kYXRhfSkubGVuZ3RoP2EuYS5nYShhLmIuZmlsdGVyKGZ1bmN0aW9uKGgpe3JldHVybiBoLnZhc3RfZGF0YX0pKToKKGEuZigpLGEuTChhLmV2ZW50Lk9hLCJ2ZXJ0aWNhbGl6ciIpLGEuWmEoImVycm9yIix7fSkpfSl9O1IucHJvdG90eXBlLk89ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuYS5wbGF5ZXIub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGMpe2EuQT0hMDtjLmRpc3BsYXk9YTthLkwoYS5ldmVudC5vYyxjKTthLlphKCJ0aW1ldXBkYXRlIixjKX0pO3RoaXMuYS5wbGF5ZXIub24oImVuZGVkIixmdW5jdGlvbihjKXthLkwoYS5ldmVudC5OYSxjKTthLlphKCJlbmRlZCIsYyl9KTt0aGlzLmEub24oInZpZGVvc3RhcnQiLGZ1bmN0aW9uKCl7YS5MKCJ1bmNsb3NlIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYz10aGlzO3RoaXMucGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe2MuTChjLmV2ZW50LmxjKTtjLlphKCJjbGlja3Rocm91Z2giLHt9KX0pfS5iaW5kKGEpLDApfSk7dGhpcy5hLm9uKCJjbG9zZSIsZnVuY3Rpb24oKXthLkwoImNsb3NlIik7CmEuWmEoImNsb3NlIix7fSl9KX07Ui5wcm90b3R5cGUuVD1mdW5jdGlvbigpe3JldHVybiEwfTtSLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLmYoKX07Ui5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3RoaXMuYj1udWxsO3RoaXMuYSYmKHRoaXMuYT10aGlzLmEuWigpKX07Ui5wcm90b3R5cGUuZ2V0Q3VycmVudFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hJiZ0aGlzLmEucGxheWVyP3RoaXMuYS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKTotMX07Ui5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hJiZ0aGlzLmEucGxheWVyP3RoaXMuYS5wbGF5ZXIuZ2V0RHVyYXRpb24oKTotMX07Ui5wcm90b3R5cGUubD1mdW5jdGlvbigpe307Ui5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5BPyh0aGlzLmEucmVzdW1lKCksdGhpcy5hLnBsYXllci5wbGF5KCkpOnRoaXMuSz90aGlzLmEuUmEoKTpzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5wbGF5KCl9LAo1MCk7dGhpcy5MKCJ1bmNsb3NlIil9O1IucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5hJiZ0aGlzLmEucGxheWVyLnBhdXNlKCl9O1IucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7dmFyIGE9ITA7dGhpcy5hJiYoYT10aGlzLkE/dGhpcy5hLnBsYXllci5pc1BhdXNlZCgpOiEwKTtyZXR1cm4gYX07Ui5wcm90b3R5cGUuWGE9ZnVuY3Rpb24oKXt0aGlzLmEucGxheWVyLlhhKCl9O1IucHJvdG90eXBlLiRhPWZ1bmN0aW9uKCl7dGhpcy5hLnBsYXllci4kYSgpfTtSLnByb3RvdHlwZS5lYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmEucGxheWVyLmViKCl9O1IucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihhKXt0aGlzLmEmJnRoaXMuYS5yZXNpemUoYSl9O1IucHJvdG90eXBlLnNiPWZ1bmN0aW9uKGEpe3RoaXMucGFyZW50PWE7dGhpcy5hLndiPWE7dGhpcy5hLmFwcGVuZCgpO3RoaXMuYS5zaG93KCl9O3koUyx2YSk7Uy5wcm90b3R5cGUubGE9ZnVuY3Rpb24oKXt2YXIgYT0KdGhpczt0aGlzLmIuaWQ9ImxpbW8iO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuYik7dGhpcy5CLmlkPSJsaW1vX3N3aXBlciI7dGhpcy5CLmNsYXNzTGlzdC5hZGQoInN3aXBlIik7dGhpcy5iLmFwcGVuZENoaWxkKHRoaXMuQik7dGhpcy5HLmlkPSJsaW1vX3N3aXBlcl9jb250ZW50Ijt0aGlzLkIuYXBwZW5kQ2hpbGQodGhpcy5HKTt0aGlzLmwuaWQ9Im1lbnUiO3RoaXMubC5jbGFzc0xpc3QuYWRkKCJzdGFydCIpO3RoaXMubC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ1bCIpKTt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmwpO3RoaXMuTy5pZD0iaGVhZGVyIjt0aGlzLm09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7dGhpcy5tLmlkPSJsb2dvIjt0aGlzLm0uY2xhc3NMaXN0LmFkZCgic3RhcnQiKTt2YXIgYz0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vdmVydGljYWxpenIvbG9nby1zdm0ucG5nIjtnLmouYigic3BpZWdlbC5kZSIpJiYKKGM9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3ZlcnRpY2FsaXpyL2xvZ28tc3Bvbi5wbmciKTtnLmouYigid2ViLmRlIikmJihjPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS92ZXJ0aWNhbGl6ci9sb2dvLXdlYmRlLnBuZyIpO3RoaXMubS5zcmM9KGcudi5iKCJ2ZXJ0aWNhbGl6ciIpfHx7fSkubG9nb3x8Yzt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm0pO3RoaXMuZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmYuaWQ9ImNsb3NlIjt0aGlzLmYuY2xhc3NMaXN0LmFkZCgic3RhcnQiKTt0aGlzLmYuaW5uZXJIVE1MPSI8aW1nIHN0eWxlPSdtYXJnaW4tdG9wOjNweDttYXgtd2lkdGg6MjBweDsnIHNyYz0nZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCa0FBQUFaQ0FZQUFBREU2WVZqQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5VnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURZdU1DMWpNREF5SURjNUxqRTJORFEyTUN3Z01qQXlNQzh3TlM4eE1pMHhOam93TkRveE55QWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lESXhMaklnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk1UWXhNakpHUmpsQ05UWXdNVEZGUVRnNE5rTkROVGRDUVRFNE1UUTJPRVFpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TVRZeE1qSkdSa0ZDTlRZd01URkZRVGc0TmtORE5UZENRVEU0TVRRMk9FUWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG94TmpFeU1rWkdOMEkxTmpBeE1VVkJPRGcyUTBNMU4wSkJNVGd4TkRZNFJDSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEb3hOakV5TWtaR09FSTFOakF4TVVWQk9EZzJRME0xTjBKQk1UZ3hORFk0UkNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BsMDhCSUlBQUFTZlNVUkJWSGphZkZaWFM2eEpFRzBRVWZRZmlHQkFUQmdRTSthTStpU1lYbFpNNkwzcU9ONVJ4Q3hpd0lBaWdpRCtBUjkyRjVabFFaYTcreUx1Z3k5bXhheVlzMnRXRExWVmpkWDJySElIK3B0dnFydnI5S211VXpYaTVlVkYzTjNkaWRqWTJGOHRMUzJQYW1wcXZnS0F1THE2RXB1Ym0ySmhZVUhNenM3S01UTXpJNytYbHBia1dGbFpFUnNiRzJKblowZGNYMThMMnRmZTNwNWpZV0Z4NU9ucE9Vbyt5Q1lmWVdGaHZ3bDg1ZEhiMjJzZysrSGhvWmlibS9zaHlOcmFtamc1T1pGK2hvYUc4dG1IbFpVVkJBUUVmSDk5ZlJVaU9qcjZkekxpQWtoT1RsWkFYVjFkNWJSeGZYMWRURTFOZlFwQ1kzZDNWd0lNREF3VThkN2EybG9ZR3h1VDc0R0JnWDhLbmlncUtvS25weWRBVmdxb3RiWFZTQTdveE5QVDAyWWdpNHVMWW10clN3TDA5L2NYOHA2eXNqSzR2THdFYjI5djVVZjA5ZlY5NFI4SkNRbnc4UEFBOGZIeGFrRmRYVjBsQXpFakFxQzdJRHN5THVhMVZWVlZjSEZ4QVhaMmRtcC9SMGVIU1M1RW9ESTJwcWFtd3ZQek0wUkdSdXBBRmJTT0dFeE9UdW9BaW9IQllJQ2JteHR3Y0hCUSs1cWJtMnZVeGRQbzdPd3M1MG5NTk1rb01URlJiY0NzazR3WUFFK29JbUF5bWVEOC9CenM3ZTFCczlXeGIwRzNqM2ZCNmFlQWtwS1NnRDU2NkJvYUdrcmZtUC9FdHBLU0VyaS92d2RIUjhjUEFMZTN0KzhnU0ZNT01qUTFOWmw0Y1Z4Y0hLQ0dJQ1VsUlRuQURQeUYzOHZMeStVZE9EazVnV1pySkQ5N2UzdmkrUGo0SFlRUUtkZlB6czZrRVdOcDFFTkhIMkttYTZtNHVCZ2VIeC9CMmRsWjJTb3FLdXBwUDRtVDd1LzA5TlFjaEFBbzUwbUFORkZmWDY4WVJVVkZTVVpwYVdueXQ5Rm9sQXgwQUxUVjg1MVI5cTJ1cm40T3NyKy9MMHNKQ3d3WkdheXRyVy9KQ1dVYkNRd3ZITWJIeDhIRnhZV1ZmVjlaV1ZuREFLUWxGcW9LRnoyb2RoRUl4WkVVVHZXS2dUQk1QMnZoK0JDNjhQRHdVVnBINnltOWFTK1ZHZ29aaXZJZEJMTkRoWXVvMGlLeWQzZDM1OW5hMnY3TEZXRmlZZ0l5TXpNQkhhblEyZGpZWERjMk5wYlIrdVhsWlZucnFCS1FQL0w3QVdSN2UxdnBBTk5aNlNBL1AxK1dDaDhmSC9rN0ppWUdNTVFLNksxZVNjSFNBU2thRkNxVndneEMyWFYwZE1SQ1Uwb3VMQ3lVTmMzVjFkVXN1NEtDZ2dEdkV6SXlNblFnV2VzT0RnNWtBcG1CMEoxd1A5Q1ZuSnViQzlnVEFIc0RhSmsyeXU4aElTR1NVWHA2dWw0WlROeVBXSHZ5d1lwSEpSZjhuNEc3dTd0eWdGbFVUZXZhMnRyVVFmejkvU1dqN094c3RhNmxwY1dvKzFXMUM4dTE2Z2M1T1RtQXpNREx5K3VERGlocjZCc3Z1NExuc0dmSTRxZ0Q0VUcrcWRwRmorSGg0VHllek12TGt3emMzTncrS0prRVJuMkYrNGhlR1h4OWZRRmJ1VHlnMW1GbDFvbkJ3Y0VjTm1abFpja1ljeGE5TVdqa3JDRWR6TS9QbXpVc0JGS1Z3Yy9QVDFZR25SRzJneStxTTVhV2xzbys0dUhob1JaVVYxZlhjUXZtemtnZzNCazVkQmdheFlpU2hHb2E3bjNQeHREUTBML29wYUNnQUlLRGc5VUUxaTRKUUdXR0FFaGtPZ2dORWgrbDY1dXV2dkZlL0FNQkl5TWpERG91RnlETjc3b0d1S05ScmxPN0pZRFBRT2lPaUNYL1crbnA2VEhvZmpBei8wRldsbktTYWt4RVJNUWYrTC9yQktsWGtRMnJySFJDdGVoSElNU1U3b2ZyRkdacENmbzV4b1AvemVMK1Q0QUJBTGNkT0xNZUJqRmJBQUFBQUVsRlRrU3VRbUNDJz48L2ltZz4iOwp0aGlzLmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7YS5jbG9zZSgpO2EuSXx8KGcuai50cmFjaygidnJ0Y2x6cl9jbG9zZWQiLCIiLCEwKSxhLkk9ITApfSk7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5mKTt0aGlzLmxhYmVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMubGFiZWwuaWQ9InRpdGxlIjt0aGlzLmxhYmVsLmlubmVySFRNTD0iTnVyIGVpbiBTcG90IElocmVyIFdhaGwiO3RoaXMubGFiZWwuY2xhc3NMaXN0LmFkZCgic3RhcnQiKTt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmxhYmVsKTt0aGlzLnM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5zLmNsYXNzTGlzdC5hZGQoImxpbW9fc3Bpbm5lciIpO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucyk7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5PKX07Uy5wcm90b3R5cGUuUmE9ZnVuY3Rpb24oKXt0aGlzLkQ9ITF9OwpTLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXt9O1MucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiYm9keS1uby1zY3JvbGwiKTt0aGlzLndiLmZpcnN0Q2hpbGQ/dGhpcy53Yi5pbnNlcnRCZWZvcmUodGhpcy5jb250YWluZXIsdGhpcy53Yi5maXJzdENoaWxkKTp0aGlzLndiLmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKX07Uy5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn07Uy5wcm90b3R5cGUua2E9ZnVuY3Rpb24oKXt0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5PSJub25lIn07Uy5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7aGlzdG9yeS5wdXNoU3RhdGUoe3ZlcnRpY2FsOiEwfSwiIiwiIyIrZy5qLmcoNSkpO2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiYm9keS1uby1zY3JvbGwiKTtBcnJheS5mcm9tKHRoaXMuaSkuZm9yRWFjaChmdW5jdGlvbihhKXthLmNsYXNzTGlzdC5yZW1vdmUoImNsb3NlZCIpfSk7CnRoaXMuRD0hMX07Uy5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImJvZHktbm8tc2Nyb2xsIik7QXJyYXkuZnJvbSh0aGlzLmkpLmZvckVhY2goZnVuY3Rpb24oYSl7YS5jbGFzc0xpc3QuYWRkKCJjbG9zZWQiKX0pO3RoaXMucGxheWVyLmlzUGxheWluZ3x8dGhpcy5rYSgpO3RoaXMuRD0hMDt0aGlzLkwoImNsb3NlIil9O1MucHJvdG90eXBlLnBhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPTMwLGQ7dGhpcy5LPXNldEludGVydmFsKGZ1bmN0aW9uKCl7ZD1wYXJzZUludChjJTYwLDEwKTtkPTEwPmQ/IjAiK2Q6ZDthLmxhYmVsLmlubmVySFRNTD0iTnVyIGVpbiBTcG90IElocmVyIFdhaGw8YnI+c3RhcnRldCBpbiAiK2QrIiBTZWt1bmRlbiI7ZG9jdW1lbnQuaGFzRm9jdXMoKSYmIWEuRCYmLTE+PS0tYyYmKGM9MzAsY2xlYXJJbnRlcnZhbChhLkspLGEubmEoKSl9LDFFMyl9O1MucHJvdG90eXBlLmdhPWZ1bmN0aW9uKGEpe3ZhciBjPQp0aGlzLGQ7RmMoZnVuY3Rpb24oZSl7c3dpdGNoKGUuYSl7Y2FzZSAxOmlmKCFhLmxlbmd0aClyZXR1cm4gZS5yZXR1cm4oKTtjLkE9YTtkPTA7Y2FzZSAyOmlmKCEoZDxjLkEubGVuZ3RoKSl7ZS5hPTQ7YnJlYWt9cmV0dXJuIHFjKGUsYy5oYShjLkFbZF0udmFzdF9kYXRhKSwzKTtjYXNlIDM6ZCsrO2UuYT0yO2JyZWFrO2Nhc2UgNDpjLkEuZm9yRWFjaChmdW5jdGlvbihmLGgpe2MuaS5wdXNoKGMuaWEoZixoKSk7Yy5lYShoKX0pLGUuYT0wfX0pfTtTLnByb3RvdHlwZS5oYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLGQsZSxmLGgsbTtyZXR1cm4gRmMoZnVuY3Rpb24oRCl7MT09RC5hJiYoZD0wKTtpZig1IT1ELmEpe2lmKCEoZDxhLmIubGVuZ3RoKSl7RC5hPTA7cmV0dXJufWU9YS5iW2RdO2Y9ZS5hPWMuZGEoZS5hKTtyZXR1cm4gcWMoRCxnLmoua2EoZlswXS51cmwpLDUpfWg9RC5iO209Zy5qLkIoaCk7ZS5hWzBdLnVybD0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iKwptO2QrKztELmE9Mn0pfTtTLnByb3RvdHlwZS5kYT1mdW5jdGlvbihhKXt2YXIgYz1OdW1iZXIoZy52LmIoImJpdHJhdGUiKSl8fDFFMzt0cnl7dmFyIGQ9YS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuLTEhPWYudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gTWF0aC5hYnMoYy1mLmJpdHJhdGUpLU1hdGguYWJzKGMtaC5iaXRyYXRlKX0pLGU9YS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuLTE9PWYudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gTWF0aC5hYnMoYy1mLmJpdHJhdGUpLU1hdGguYWJzKGMtaC5iaXRyYXRlKX0pO2E9ZC5jb25jYXQoZSl9Y2F0Y2goZil7fXJldHVybiBhfTtTLnByb3RvdHlwZS5uYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYz10aGlzLkFbdGhpcy51LmdldFBvcygpXTtnLmoudHJhY2soInZydGNsenJfY2hvc2VuX2F1dG8iLHRoaXMudS5nZXRQb3MoKSwhMCk7dGhpcy5VKCk7CnRoaXMuTCgidmlkZW9zdGFydCIpO3ZhciBkPWMudmFzdF9kYXRhLGU9Yy5pZDtmZXRjaChnLmoubyhjLnNyYywhMCkpLnRoZW4oZnVuY3Rpb24oKXthLnBsYXllci5jKHtpZDplLGFsaWFzOmEuYS5xY30pO3ZhciBmPWQuWWMoKTthLmEud2Q9Zi5VYjthLmEuTCgiU0hPV0NPTlRST0xTIik7YS5wbGF5ZXIuc3RhcnQoZil9KX07Uy5wcm90b3R5cGUuVT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7QXJyYXkuZnJvbSh0aGlzLmNvbnRhaW5lci5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbihjKXtjIT1hLnBsYXllci5jb250YWluZXImJmMhPWEuTyYmYyE9YS5tJiZjIT1hLmxhYmVsJiYoYy5zdHlsZS5kaXNwbGF5PSJub25lIik7Yz09YS5sYWJlbCYmKGEubGFiZWwuaW5uZXJIVE1MPSJOdXIgZWluIFNwb3QgaWhyZXIgV2FobCIsYS5sYWJlbC5zdHlsZS5tYXJnaW5Ub3A9IjdweCIpfSk7dGhpcy5mLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt0aGlzLmMuc3R5bGUuekluZGV4PSIxMTAwMCI7dGhpcy5jLnN0eWxlLnRvcD0KIjcwcHgiO3RoaXMuYy5zdHlsZS5yaWdodD0iMHB4Ijt0aGlzLmMuc3R5bGUuY29sb3I9IndoaXRlIjt0aGlzLmMuc3R5bGUuZm9udEZhbWlseT0iUm9ib3RvLCBhcmlhbCwgc2Fucy1zZXJpZiI7dGhpcy5jLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5jLmlubmVySFRNTD0nPGRpdiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBSb2JvdG8sIGFyaWFsLCBzYW5zLXNlcmlmOyBvcGFjaXR5OiAwLjc7IHBhZGRpbmc6IDZweDsgYm9yZGVyOiAjRkZGRkZGOyBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsiPk1laHIgZXJmYWhyZW48L2Rpdj4nO3RoaXMuYy5vbmNsaWNrPXRoaXMuYS5SYy5iaW5kKHRoaXMuYSk7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jKX07Uy5wcm90b3R5cGUucWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuVysrO3RoaXMuVz49dGhpcy5pLmxlbmd0aCYmKGcuai50cmFjaygidnJ0Y2x6cl9hbmltYXRpb25zdGFydCIsCiIiLCEwKSx0aGlzLmkucmV2ZXJzZSgpLHRoaXMuaS5mb3JFYWNoKGZ1bmN0aW9uKGMsZCl7c2V0VGltZW91dChmdW5jdGlvbigpe2MuY2xhc3NMaXN0LnJlbW92ZSgic3RhcnQiKTthLm9hKGQpO2QhPT1hLmkubGVuZ3RoLTE/c2V0VGltZW91dChmdW5jdGlvbigpe2MuY2xhc3NMaXN0LmFkZCgib3V0Iil9LDc1MCk6c2V0VGltZW91dChmdW5jdGlvbigpe2Euc2EoKX0sNzUwKX0sNzUwKmQpfSksdGhpcy5pLnJldmVyc2UoKSl9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKCl7dGhpcy5tLmNsYXNzTGlzdC5yZW1vdmUoInN0YXJ0Iik7dGhpcy5sYWJlbC5jbGFzc0xpc3QucmVtb3ZlKCJzdGFydCIpO3RoaXMubC5jbGFzc0xpc3QucmVtb3ZlKCJzdGFydCIpO3RoaXMuZi5jbGFzc0xpc3QucmVtb3ZlKCJzdGFydCIpO3RoaXMuRy5jbGFzc0xpc3QuYWRkKCJzd2lwZS13cmFwIik7dGhpcy5zLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5zKTt0aGlzLmxhYmVsLmlubmVySFRNTD0KIk51ciBlaW4gU3BvdCBJaHJlciBXYWhsPGJyPnN0YXJ0ZXQgaW4gMzAgU2VrdW5kZW4iO2Zvcih2YXIgYT10aGlzLmkubGVuZ3RoLTE7MDw9YTthLS0pdGhpcy5pW2FdLmNsYXNzTGlzdC5yZW1vdmUoIm91dCIpO3RoaXMuUCgwKTt0aGlzLnBhKCk7dGhpcy5tYSgpfTtTLnByb3RvdHlwZS5pYT1mdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmNsYXNzTGlzdC5hZGQoInN3aXBlLWl0ZW0iKTtlLmNsYXNzTGlzdC5hZGQoInN0YXJ0Iik7Zy5qLmZiKGEucG9ydHJhaXRfaW1hZ2VfdXJsfHxhLmltYWdlX3VybCkudGhlbihmdW5jdGlvbihoKXtmZXRjaChoKS50aGVuKGZ1bmN0aW9uKG0pe3JldHVybiBtLmJsb2IoKX0pLnRoZW4oZnVuY3Rpb24obSl7ZS5zdHlsZS5iYWNrZ3JvdW5kU2l6ZT0iY292ZXIiO2Uuc3R5bGUuYmFja2dyb3VuZEltYWdlPSJ1cmwoJyIrVVJMLmNyZWF0ZU9iamVjdFVSTChtKSsiJykifSkudGhlbihmdW5jdGlvbigpe2QucWEoKX0pfSk7CnZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2YuY2xhc3NMaXN0LmFkZCgiaWNvbi1wbGF5Iik7Zi5zZXRBdHRyaWJ1dGUoImRhdGEtaWQiLGMpO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7Yy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRWdBQUFCSUNBWUFBQUJWN2JOSEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVZwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRNElEYzVMakUyTkRBek5pd2dNakF4T1M4d09DOHhNeTB3TVRvd05qbzFOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJREl4TGpFZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZNREUyTWpjeE4wUTFOakpETVRGRlFVSXhRVE5DUWpBd1JUTkJOa0UzT0VZaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk1ERTJNamN4TjBVMU5qSkRNVEZGUVVJeFFUTkNRakF3UlROQk5rRTNPRVlpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvd01UWXlOekUzUWpVMk1rTXhNVVZCUWpGQk0wSkNNREJGTTBFMlFUYzRSaUlnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG93TVRZeU56RTNRelUyTWtNeE1VVkJRakZCTTBKQ01EQkZNMEUyUVRjNFJpSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbWZ1K3RVQUFBajNTVVJCVkhqYTVKeC9iRlBYRmNmdnM1L3QrRWVNN1dEeXkrRm4yZ0loSTJFdEN4QWdDUzFTdDBJSFNsczJDbDNYcllPbFk2Qk5kRkpWVFdocllXcTcwaUZhRkdtTVRtdW5UbUZiMTBGYXVnRnRhRUxhTkZCQ0EwNGdKSEZpNDlpeEV5Y2tzYkdkM1ROZnN6Y3JUbUw3dnVjZlBkTDNINGp2OC92NDNIUFB1YjhZSkt5SnNQS3dERmlaUkxPd2xGZ3lyRFR5ZDJOWWJxeGJXSDFZVnFJZUxCT1dYNmd2ekFqd0RDMVdNZFpDckx1d0ZERzJONExWam5VVnF4bHJJQmtCU2JEdXhWcUZsYy9qYzhDVHJtQTFFbGkzRXgyUUhLc0NxeHdyWGVEdU80UjFCdXMwMW1paUFXSUpsRzlTNkVLeEdzU3RXZ0xMbXdpQTdzRjZuQVRiUkRJSTduL0NNc1lMa0JTckVtdU5RTUUrR2h2SCtoaXJCc3NqSkNBWW5uZGc1YURrTURQV0VaSXFSR1RpS0I2MkdHczNsZzRsajhHQXNRS3JHOHZHSjZBU3JLZEo5MG8yZzRGa09aYURKSnpVQWEzRzJrNnk0V1ExQ0NsTHNRYUpOMUVEOUhXc0o1SWNEaGZTRWhLUHpEUUFMU1FCV1l4U3g0S2UxSUZsandVUWpGWjdTQ0daYWdhOW9RanJBa2t1dy83UlpIbk9EbEkrcEtySnlUdEtvL0dnUjdFS1VlcGJPaW1QTGtmaVFWQ0JyMFZmSFZ0TDNubGFIZ1RRcXJEVUZDTWlNMCtuMTI4c3I3aG5mbVpXaGd3eE11dmdnQ3ZCZ3ZaY3JEcFNua3dLYUIxSkNLbkJlZkhaNThyK2N1cmtxbzFiSHN0OTdNbnZ6UzVic3liWDBkbkZ5TWFSekRMZ0hFd1FTR295VGRJeEdhQXBnMWFrdG1QTDF1VXZISDZ0d092MW92SHhjZVQzKzFGR1ZwYWtjdnMyUTg0c3ZkcmUyZVhYeXVWS2l6TWhRTTBqeGEwM0hLRDFOQVB6M0prWitpUEhqcTVNMTJqWjBQOERVSGN2V2FKODlJbnRjejJETHFiZmJQYWJIWTU0UTVLUXFyOTlJa0FTMm5WV3JpNUQrOXdMTHk0Q0dCUE9SV0NQRW9sRWFFVkZ1ZTdoelp2bit1ejlNdC9vQ0l0QkRjUVJVaTRLVExiNVF3RjlneFJ6MUN4dnBrNzc5SzZmNW9jRHhBVWxWNmxFRDI3ZW5MbHNXWkhlYVRhSk5DcTV5bVMxT2VNQUNCeWtMMWpRY2dGdHdjcWdDaWhMci8xQjFVOFdUQVdJMisyeURIbXlSN1p1TTZpVUtzV28weWJHVFdpNnpWYUh3SkJVV1BYY1BFZ1hMZytJeGNReVNjVDFHM2lURDRPcTNMb3Q2NTMzYWt1LzlkRERzOWVXRk44dE1LQUZoTWtkRDFwQktseTZRMEoyWnNhVFA5bzViN29lRkFwS3pMS290S3hjVjFHK0xtZlVaWmZLcFNLRlFON0VrSG1qRzBGQUc3SDB0SjlpME9zMDM5OVpOVDhhUUZ4UWFvMVd2R0ZUWmRiOE9mTzBMc2ROY1ZhR2RrWm5qNlZmQUVpTkxPbG0rWHc4d2V2MVVWa2lCa2lRUjYxZTk0Qm1aVmw1eVZ2SGp2YUtHSkhvZEVQVFZSNEJBUk14ZU5BY3JESStucENOZitrZlByTXJQeFlQQ2dYRk1Bd3F2dmMrOVladmI4cER0MXdLNVBGSVRkWStQcm9kc0xra0pvbmgxL2dBTkNkemx1NnBIeit6Z0JZZ0xpaFpXaHF6L3FHTittWEZ4WHJuelI2eFJwT3VOcGx2MHU1MlhRQm9KVW14cVZ2ZXpBenRVMVgwQVhIVGdzeWNYR25sZHgvUDFjMVFLOGFHbkpMWmhweVpIVjBtRzZWSDlBTWdXRExtWlZWVXExQ29kdTdlY3hkZmdMZ2V0YkNnVUxtcDhwRThsOVBwOTdwSHBEZTZlK3dVbWg0R1FBOGluallhcUZpSmJOZmV2WXY0Qm5TbmJNRWh0YVIwdGViK0I5Ym5vdHNqU3FWVW9yeGhpZ21VVjBTeVJuNjZBSHhyZ2Mzbjg2SE03QnoyNWQrOXNmajVmZnNLVnk0dGpHV0VUZ2RBS1RjaEgwd0xWcTJ0MEJ3NmNtUjVmbTVPdEV2a1VsNEJTU1JzWEplS29Hc1hMUzlSRlN4YUdHMk5tU1pDRlBiUWhQVlBwVUtXQ041a3lEVW9vLzA4QUhMejVrRnBrcml2eEVKaTJkWGRNUlRseDkzd0FtTjhmVGt4SzQ0cklKaU0rN1Mrem1XODF1R01CZEFvYis2TmhCL0ZnbDdEc2l3NlYzZG00QmMvMzlQY2JqS2JvMnhxQ0lwVm1ONDA4SVZJYUJQalhNaHFOWHQvKzhyKzlwYVdGc2RIalJmYVltak9DWUJzdlAyU0xDc1NzanQ1UEc1VVhYMm8rOFEvLzlIei9nY2ZYNmJRckEwQTlmTDFwVm1wVkN4RWR3STR0Ylh2OWg4Nzl2dU9vU0dYNTlTcGMxOVNhcjRYQUpsNGMzY3B2eDRFY2FhMTlkTG9hd2RmYXVzMmRROVRCQk0wVXhBUXJBVlIzMVluWWxtR3J6ampjZzJNSHp5NHY3MmhvYUh2d3cvclczbDRqQ2NJeUlkMURRVTJaOUtPQ3d6dE9PUHplZEdiZjZqdXFhbDVwNnYyQStvZXd6Vmc0Z3V1ZUxid0FRaU4wd0VFY1FhODV1eS9UamdPSDNyVmFMUDNqOVdkdjlUT2MzajdiNUFQQXJxSUF2dUJxUDdpWWpiMlRCckFkRjF2Y3gvNDlmTmZYcmxxSERqMzJlVnJRbFFvS0xEejdBNGdtTk85amloUDNvdkUwUU9DN3VRZUcwVUg5dit5N2VTSmsxMk5YeGh2Q0poT1hTZE1FSGRUd1RuYWdCZ204aTRXR0xZWjlMZmpiMXVyWHo5a2RBME91UVdHQS9iSm5aR1M4NDlOS0hEMlFvWGlaREJzWDJ4dUdQN05nVisxV2l5V1czWDF2TWVaaVd3WTY3T0pBTUZoTk5qVnNJSGFvN3orOGVuR0didk40bjE1L3o1anc2Zm5yWitjRnlUT2hMTXppSE13TDNUZnpyOVJZSWNabFROZjdqR1B6K1VhUkhLNUlteWM4WHB2bytyREwzVWVyNm5wUEZ0L3NRM0YxMFlJZy8vOWVLRy9PY21MQ21nOFRhUEdOaU05cmFoNFdUcDNlanBZYmIvL1hvMTk3NTZxNXFhbXorMTFqWEhwVHFIMkxnbzVYelpScmRTSkFvZHdZOTdFYWVtek9vWUhIYXg2aGxLK2FIR2hFandHdXBQeFNzdm9zN3QzZnZIM3Z4N3ZQRjEvb2MxazduTWtBQnlvU2Q4TW5ZSUlOOHJBNmVTZjBjcUwxdDlmV3FDVVNrVFpPZGtLdTgwMjF0UGJPMXpmMUhvZEpZNEJsRmNRWit2ZFZJREF2b040V3JOUFFEdUw5ZWNKNCtRa0h6b092ZVFyQU1kQzNoVkZDZ2lxMlRjUWoxT3lDV0NqNUIzRG5tZWRha0xyRmduYTk2SFVPQ3NXT21LL2p0VTFhWTQyallaZ2JidVBqR3hNaXNDQnpRSkhzUzVObWNST3MwRllGWUN6RllVcEFBbEdyTGV4ems4cnk0K2c0VzdpVFV1VEdCSjR6aCs1eFNoTlFHQ3d1Um9xNjZJSnlwUkV0ekVTa0pzaitWQTBxdzZ3VEFTVFNYQWxSWHFTd0lFUThTcjVjUkhmZ0lLald3TUtYSXcwQnlYKzFSVFZKSVpHYkRSZURFNUZiMFdKZWJuSld5aHdFVlBVbG9yWDQ4Q1V4VW1VUU5mamNBM2dWSkFhTGg0WExIMUU1bk5HYURYSzV4VmRrSDJYWXMxSC9GN1JaU1R4TUNtdTZKcklNa2hhc0lSTW8waGliTzgybVphQWRhdlBVWkplOGpiWnFBblhCTUtwUHU0MWdiQlFBRmNFU2ptRk11UXR3K2ovcndtRVNTMVlLdmNKOVlYL0k4QUFKWXZmbHVPaStKRUFBQUFBU1VWT1JLNUNZSUk9IjsKZi5hcHBlbmRDaGlsZChjKTtlLmRhdGE9YTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuaWQ9InN1YmxpbmUiO2MuaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJsYWJlbCI+JythLnN1YmxpbmUrIjwvZGl2PiI7ZS5hcHBlbmRDaGlsZChjKTtlLmFwcGVuZENoaWxkKGYpO3RoaXMuRy5hcHBlbmRDaGlsZChlKTtyZXR1cm4gZX07Uy5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO0FycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaWNvbi1wbGF5IikpLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9Yy5nZXRBdHRyaWJ1dGUoImRhdGEtaWQiKTtkJiZjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoYS5LKTtnLmoudHJhY2soInZydGNsenJfY2hvc2VuIixhLnUuZ2V0UG9zKCksITApO2EuVSgpO2EuTCgidmlkZW9zdGFydCIpO3ZhciBlPWEuQVtkXSxmPWUudmFzdF9kYXRhLGg9ZS5pZDtmZXRjaChnLmoubyhlLnNyYywKITApKS50aGVuKGZ1bmN0aW9uKCl7YS5wbGF5ZXIuYyh7aWQ6aCxhbGlhczphLmEucWN9KTt2YXIgbT1mLlljKCk7YS5hLndkPW0uVWI7YS5wbGF5ZXIuc3RhcnQobSl9KX0pfSl9O1MucHJvdG90eXBlLm1hPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLnU9bmV3IFN3aXBlKHRoaXMuQix7c3RhcnRTbGlkZTowLGF1dG86ITEsZHJhZ2dhYmxlOiExLGF1dG9SZXN0YXJ0OiExLGNvbnRpbnVvdXM6ITAsZGlzYWJsZVNjcm9sbDohMCxzdG9wUHJvcGFnYXRpb246ITAsdHJhbnNpdGlvbkVuZDpmdW5jdGlvbihjKXthLnRhKGMpO2EuWXx8KGEuWT0hMCxnLmoudHJhY2soInZydGNsenJfYW5pbWF0aW9uZmluaXNoZWQiLCIiLCEwKSl9fSk7dGhpcy5mYSgpfTtTLnByb3RvdHlwZS50YT1mdW5jdGlvbihhKXt0aGlzLlAoYSl9O1MucHJvdG90eXBlLlA9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5sLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImxpbW9idXR0b24iKTtjLmxlbmd0aCYmKEFycmF5LmZyb20oYykuZm9yRWFjaChmdW5jdGlvbihkKXtkLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpfSksCmNbYV0uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikpfTtTLnByb3RvdHlwZS5vYT1mdW5jdGlvbihhKXt0aGlzLmwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibGltb2J1dHRvbiIpW2FdLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgic3RhcnQiKX07Uy5wcm90b3R5cGUuZWE9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkPXRoaXMubC5maXJzdEVsZW1lbnRDaGlsZCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIik7ZS5jbGFzc0xpc3QuYWRkKCJzdGFydCIpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2YuY2xhc3NMaXN0LmFkZCgibGltb2J1dHRvbiIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7Yy51LnNsaWRlKGEsNTApO2MuUChhKX0pO2UuYXBwZW5kQ2hpbGQoZik7ZC5hcHBlbmRDaGlsZChlKX07Uy5wcm90b3R5cGUuYmE9ZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImJvZHktbm8tc2Nyb2xsIik7CnRoaXMuTCgiY29tcGxldGUiKX07Uy5wcm90b3R5cGUuWj1mdW5jdGlvbigpe2Zvcihkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImJvZHktbm8tc2Nyb2xsIik7dGhpcy5iLmZpcnN0Q2hpbGQ7KXRoaXMuYi5yZW1vdmVDaGlsZCh0aGlzLmIubGFzdENoaWxkKTt0aGlzLmImJnRoaXMuYi5wYXJlbnRFbGVtZW50JiZ0aGlzLmIucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmIpO3RoaXMuY29udGFpbmVyJiZ0aGlzLmNvbnRhaW5lci5wYXJlbnRFbGVtZW50JiZ0aGlzLmNvbnRhaW5lci5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuY29udGFpbmVyKTtyZXR1cm4gbnVsbH07eShjYSx2YSk7Y2EucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dGhpcy5PPWEuaWQ7dGhpcy5QPWEuYWxpYXN9O2NhLnByb3RvdHlwZS5zPWZ1bmN0aW9uKCl7dmFyIGE9YmIucG9wKCk7YXx8KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSxhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7CnJldHVybiBhfTtjYS5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oYSl7dGhpcy5CKGEpfTtjYS5wcm90b3R5cGUuQj1mdW5jdGlvbihhKXt2YXIgYz10aGlzO0ZjKGZ1bmN0aW9uKGQpe2MuYS5zcmM9YTtjLmEubG9hZCgpO2MucGxheSgpO2QuYT0wfSl9O2NhLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLmEuc3JjJiZ0aGlzLmEucGxheSgpLmNhdGNoKGZ1bmN0aW9uKCl7Zy5qLnRyYWNrKCJ2cnRjbHpyX3Byb21pc2VmYWlsdXJlIiwiIiwhMCk7YS5wYXJlbnQuY2xvc2UoKTthLnBhcmVudC5hLkwoYS5wYXJlbnQuYS5ldmVudC5OYSl9KX07Y2EucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5hLnBhdXNlKCl9O2NhLnByb3RvdHlwZS5pc1BsYXlpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmEuY3VycmVudFRpbWUmJiF0aGlzLmEucGF1c2VkfTtjYS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLnBhdXNlZH07CmNhLnByb3RvdHlwZS5lYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmEubXV0ZWR9O2NhLnByb3RvdHlwZS5YYT1mdW5jdGlvbigpe3RoaXMuYS5tdXRlZD0hMH07Y2EucHJvdG90eXBlLiRhPWZ1bmN0aW9uKCl7dGhpcy5hLm11dGVkPSExfTtjYS5wcm90b3R5cGUuZ2V0Q3VycmVudFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLmN1cnJlbnRUaW1lfTtjYS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLmR1cmF0aW9ufTtjYS5wcm90b3R5cGUuRz1mdW5jdGlvbigpe3RoaXMuYS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmlkKTt0aGlzLmEuc2V0QXR0cmlidXRlKCJ3aWR0aCIsdGhpcy5iLndpZHRoKTt0aGlzLmEuc2V0QXR0cmlidXRlKCJoZWlnaHQiLHRoaXMuYi5oZWlnaHQpO3RoaXMuYS5zZXRBdHRyaWJ1dGUoInByZWxvYWQiLHRoaXMuYi5wcmVsb2FkKTt0aGlzLmEuc2V0QXR0cmlidXRlKCJ3ZWJraXQtcGxheXNpbmxpbmUiLCJ0cnVlIik7CnRoaXMuYS5zZXRBdHRyaWJ1dGUoInBsYXlzaW5saW5lIiwidHJ1ZSIpO3RoaXMud2IuYXBwZW5kQ2hpbGQodGhpcy5hKTt0aGlzLmEucmVtb3ZlQXR0cmlidXRlKCJjb250cm9scyIpfTtjYS5wcm90b3R5cGUuaT1mdW5jdGlvbigpe307Y2EucHJvdG90eXBlLkk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7fSk7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIixmdW5jdGlvbigpe2EuaSgpfSk7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGMpe3ZhciBkPWMuY3VycmVudFRhcmdldDtjLmN1cnJlbnRUaW1lPWQuY3VycmVudFRpbWU7MDxkLmR1cmF0aW9uJiZhLkwoInRpbWV1cGRhdGUiLGMpfSk7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2EuTCgiZXJyb3IiKX0pO3RoaXMuYS5hZGRFdmVudExpc3RlbmVyKCJwYXVzZSIsCmZ1bmN0aW9uKCl7fSk7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7YS5MKCJwbGF5aW5nIil9KX07eShOYSxjYSk7TmEucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKGEpe3RoaXMuamE9YS5qYTt0aGlzLmw9YS5hO3RoaXMuZm9ybWF0PWEuYVswXS5mb3JtYXQ7Y2EucHJvdG90eXBlLnN0YXJ0LmNhbGwodGhpcyxhLmFbMF0udXJsKX07TmEucHJvdG90eXBlLmk9ZnVuY3Rpb24oKXt0aGlzLmEuc3R5bGUub2JqZWN0Rml0PSJjb3ZlciI7dmFyIGE9dGhpcy5hLm9mZnNldFdpZHRoL3RoaXMuYS5vZmZzZXRIZWlnaHQ7aWYoImxhbmRzY2FwZSI9PT10aGlzLmZvcm1hdHx8InNxdWFyZSI9PT10aGlzLmZvcm1hdCl0aGlzLmEuc3R5bGUub2JqZWN0Rml0PS41NjI1PmE/ImNvbnRhaW4iOiJjb3ZlciI7InBvcnRyYWl0Ij09PXRoaXMuZm9ybWF0JiYodGhpcy5hLnN0eWxlLm9iamVjdEZpdD0iY29udGFpbiIpfTtOYS5wcm90b3R5cGUuRD1mdW5jdGlvbigpe3ZhciBhPQp0aGlzO3RoaXMuYS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpezA8YS5hLmR1cmF0aW9uJiZhLksoYS5hLmN1cnJlbnRUaW1lKX0pO3RoaXMuYS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsZnVuY3Rpb24oKXthLnUoKX0pfTtOYS5wcm90b3R5cGUuSz1mdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7YSE9PXRoaXMuZiYmKDA9PT1hJiYodGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZy5qLnRyYWNrKCJ2cnRjbHpyX2ltcHJlc3Npb24iLCIiLCEwKSksYT09PU1hdGguZmxvb3IodGhpcy5hLmR1cmF0aW9uLzQpJiZ0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksYT09PU1hdGguZmxvb3IodGhpcy5hLmR1cmF0aW9uLzIpJiZ0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGE9PT1NYXRoLmZsb29yKDMqdGhpcy5hLmR1cmF0aW9uLzQpJiZ0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksCnRoaXMuZj1hKX07TmEucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXtnLmoudHJhY2soInZydGNsenJfZW5kZWQiLCIiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuTCgiZW5kZWQiKTt0aGlzLnBhcmVudC5hLlphKCJlbmRlZCIse30pfTtOYS5wcm90b3R5cGUudHJhY2s9ZnVuY3Rpb24oYSl7dGhpcy5BKGEpLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9e307ImltcHJlc3Npb24iPT09YSYmYy5pZC5pbmNsdWRlcygiSE9NQURfIikmJihkPXtob21hZF9pbXBfcHJlZml4OiJ2ZXJ0aWNhbGl6ci0ifSk7ZmV0Y2goZy5qLm8oYy51cmwsITEsZCkpfSk7dGhpcy5qYT10aGlzLm0oYSl9O05hLnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmphLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4gYy50eXBlPT09YX0pfTtOYS5wcm90b3R5cGUubT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5qYS5maWx0ZXIoZnVuY3Rpb24oYyl7cmV0dXJuIGMudHlwZSE9PWF9KX07VGEucHJvdG90eXBlLmI9CmZ1bmN0aW9uKGEpe3RoaXMuamE9dGhpcy5qYS5jb25jYXQoYSl9O0lhLnByb3RvdHlwZS5BPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLkMucXVlcnlTZWxlY3RvcigiVkFTVEFkVGFnVVJJIil9O0lhLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYztyZXR1cm4gRmMoZnVuY3Rpb24oZCl7aWYoMT09ZC5hKXthLmphPWEubygpO2EuZz1hLkYoKTtpZighYS5BKCkpcmV0dXJuIGEuYj1hLm0oKSxhLnUoKT9kLnJldHVybihuZXcgamEoYS5qYSxhLmIsYS5nLGEuQykpOmQucmV0dXJuKG5ldyBUYSgtMSE9YS5nZXREdXJhdGlvbigpP25ldyBDKEMuZik6bmV3IEMoQy5sKSx7QzphLkN9KSk7YS5zPW5ldyBuYihhLkMucXVlcnlTZWxlY3RvcigiVkFTVEFkVGFnVVJJIikudGV4dENvbnRlbnQpO3JldHVybiBxYyhkLGEucy5sb2FkKCksMyl9Yz1kLmI7Yy5iKGEuamEpO3JldHVybiBkLnJldHVybihjKX0pfTtJYS5wcm90b3R5cGUubz1mdW5jdGlvbigpe3ZhciBhPQp0aGlzO1siTm9uTGluZWFyQWRzIiwiQ29tcGFuaW9uIl0uZm9yRWFjaChmdW5jdGlvbihkKXtBcnJheS5mcm9tKGEuQy5xdWVyeVNlbGVjdG9yQWxsKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX0pfSk7dmFyIGM9W107IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe0FycmF5LmZyb20oYS5DLnF1ZXJ5U2VsZWN0b3JBbGwoZCkpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIGY9ZS5nZXRBdHRyaWJ1dGUoImlkIil8fGQudG9Mb3dlckNhc2UoKSxoPWUuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCksbT1lLmdldEF0dHJpYnV0ZSgib2Zmc2V0Iil8fGQudG9Mb3dlckNhc2UoKTtjLnB1c2goe2lkOmYsdHlwZTpoLHVybDplLnRleHRDb250ZW50LApyZXF1ZXN0OmEuaShlLnRleHRDb250ZW50KSxvZmZzZXQ6bX0pfX0pfSk7cmV0dXJuIGN9O0lhLnByb3RvdHlwZS5GPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFZlcmlmaWNhdGlvbnMiKVswXTtyZXR1cm5bXS5zbGljZS5jYWxsKGE/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uIik6W10pfTtJYS5wcm90b3R5cGUubT1mdW5jdGlvbigpe3ZhciBhPVtdO0FycmF5LmZyb20odGhpcy5DLnF1ZXJ5U2VsZWN0b3JBbGwoIk1lZGlhRmlsZSIpKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPXt9O0FycmF5LmZyb20oYy5hdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2RbZS5sb2NhbE5hbWVdPWUudmFsdWV9KTtkLmZvcm1hdD0xKmQud2lkdGg+MSpkLmhlaWdodD8ibGFuZHNjYXBlIjoxKmQud2lkdGg9PTEqZC5oZWlnaHQ/InNxdWFyZSI6InBvcnRyYWl0IjtkLnVybD1jLnRleHRDb250ZW50O2EucHVzaChkKX0pO3JldHVybiBhfTsKSWEucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmdldER1cmF0aW9uKCl9O0lhLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3RyeXt2YXIgYT1FYih0aGlzLkMucXVlcnlTZWxlY3RvcigiRHVyYXRpb24iKS50ZXh0Q29udGVudC5zcGxpdCgiOiIpKSxjPWEubmV4dCgpLnZhbHVlLGQ9YS5uZXh0KCkudmFsdWUsZT1hLm5leHQoKS52YWx1ZTtyZXR1cm4gMzYwMCorYys2MCorZCsgK2V9Y2F0Y2goZil7cmV0dXJuLTF9fTtJYS5wcm90b3R5cGUuaT1mdW5jdGlvbihhKXtyZXR1cm4gRGEmJiJmdW5jdGlvbiI9PT10eXBlb2YgRGEubz9EYS5vKGEpOm5ldyBSZXF1ZXN0KGEse21ldGhvZDoiR0VUIn0pfTt5KG5iLElhKTtuYi5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYyxkLGUsZjtyZXR1cm4gRmMoZnVuY3Rpb24oaCl7c3dpdGNoKGguYSl7Y2FzZSAxOnJldHVybiBxYyhoLGEubChhLnNyYykuY2F0Y2goZnVuY3Rpb24obSl7dGhyb3cgbmV3IFRhKG5ldyBDKEMuYiksCntlcnJvcjptfSk7fSksMik7Y2FzZSAyOnJldHVybiBjPWguYixxYyhoLGEuZihjKS5jYXRjaChmdW5jdGlvbihtKXt0aHJvdyBuZXcgVGEobmV3IEMoQy5iKSx7ZXJyb3I6bSxyZXNwb25zZTpjfSk7fSksMyk7Y2FzZSAzOnJldHVybiBkPWguYixhLmE9KG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhkLCJ0ZXh0L3htbCIpLGEuQz1hLmEucXVlcnlTZWxlY3RvcigiQWQiKSxhLkM/cWMoaCxhLnBhcnNlKCkuY2F0Y2goZnVuY3Rpb24obSl7dGhyb3cgbTt9KSw0KTooZT1uZXcgVGEobmV3IEMoQy5nKSxhLkMpLGUuYihhLmMoKSksaC5yZXR1cm4oZSkpO2Nhc2UgNDpyZXR1cm4gZj1oLmIsaC5yZXR1cm4oZil9fSl9O25iLnByb3RvdHlwZS5sPWZ1bmN0aW9uKGEpe3JldHVybiBEYSYmImZ1bmN0aW9uIj09PXR5cGVvZiBEYS5kYT9EYS5kYShhKTpmZXRjaChuZXcgUmVxdWVzdChhLHttZXRob2Q6IkdFVCJ9KSl9O25iLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3JldHVybiBGYyhmdW5jdGlvbihjKXtpZigxMD4KTWF0aC5hYnMoYS5zdGF0dXMtMjAwKSYmYS5ib2R5KXJldHVybiBjLnJldHVybihhLnRleHQoKS50aGVuKGZ1bmN0aW9uKGQpe3JldHVybiBkfSkpO25ldyBDKEMuYix7cmVzcG9uc2U6YX0pO2MuYT0wfSl9O25iLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPVtdO0FycmF5LmZyb20odGhpcy5hLnF1ZXJ5U2VsZWN0b3JBbGwoIkVycm9yIikpLmZvckVhY2goZnVuY3Rpb24oZCl7aWYoZCl7dmFyIGU9ZC5nZXRBdHRyaWJ1dGUoImlkIil8fGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtjLnB1c2goe2lkOmUsdHlwZToiZXJyb3IiLHVybDpkLnRleHRDb250ZW50LHJlcXVlc3Q6YS5pKGQudGV4dENvbnRlbnQpfSl9fSk7cmV0dXJuIGN9O3koVix2YSk7Vi5wcm90b3R5cGUuWWM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iLnNoaWZ0KCl9O1YucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpczt0aGlzLnNyYz1hO3RoaXMudSgpLnRoZW4oZnVuY3Rpb24oKXtjLkwoImNvbXBsZXRlIiwKYyl9KS5jYXRjaChmdW5jdGlvbihkKXtjLkwoImVycm9yIixkKX0pfTtWLnByb3RvdHlwZS5iYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzO3JldHVybiBGYyhmdW5jdGlvbihkKXtyZXR1cm4gMT09ZC5hPyhjLnNyYz1hLHFjKGQsYy51KCkudGhlbihmdW5jdGlvbigpe3JldHVybiBjfSkuY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBDKEMuYix7ZXJyb3I6ZX0pfSksMikpOmQucmV0dXJuKGQuYil9KX07Vi5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcztyZXR1cm4gRmMoZnVuY3Rpb24oZCl7cmV0dXJuIHFjKGQsYy5HKGEpLDApfSl9O1YucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGMsZDtyZXR1cm4gRmMoZnVuY3Rpb24oZSl7c3dpdGNoKGUuYSl7Y2FzZSAxOnJldHVybiBxYyhlLGEuUChhLnNyYykuY2F0Y2goZnVuY3Rpb24oZil7dGhyb3cgbmV3IEMoQy5iLGYpO30pLDIpO2Nhc2UgMjpyZXR1cm4gYz1lLmIscWMoZSxhLk8oYykuY2F0Y2goZnVuY3Rpb24oKXt0aHJvdyBuZXcgQyhDLmIsCntyZXNwb25zZTpjfSk7fSksMyk7Y2FzZSAzOnJldHVybiBkPWUuYixxYyhlLGEuRyhkKSw0KTtjYXNlIDQ6ZS5hPTB9fSl9O1YucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuQSgpLnRoZW4oZnVuY3Rpb24oKXthLkwoImNvbXBsZXRlIixhKX0pLmNhdGNoKGZ1bmN0aW9uKGMpe2EuTCgiZXJyb3IiLGMpfSl9O1YucHJvdG90eXBlLlA9ZnVuY3Rpb24oYSl7cmV0dXJuIERhJiYiZnVuY3Rpb24iPT09dHlwZW9mIERhLmRhP0RhLmRhKGEsdGhpcy5kYSk6ZmV0Y2gobmV3IFJlcXVlc3QoYSx7bWV0aG9kOiJHRVQifSkpfTtWLnByb3RvdHlwZS5PPWZ1bmN0aW9uKGEpe2lmKDEwPk1hdGguYWJzKGEuc3RhdHVzLTIwMCkpcmV0dXJuIGEudGV4dCgpLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGN9KTt0aHJvdyBuZXcgQyhDLmIse3Jlc3BvbnNlOmF9KTt9O1YucHJvdG90eXBlLkc9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkLGUsZjtyZXR1cm4gRmMoZnVuY3Rpb24oaCl7dHJ5e2MuYT0KKG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpfWNhdGNoKG0pe3Rocm93IG5ldyBDKEMubyx7ZXJyb3I6bSxyZXN1bHQ6YX0pO31kPWMuYS5maXJzdENoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7c3dpdGNoKGQpe2Nhc2UgInZhc3QiOmMuTGE9QXJyYXkuZnJvbShjLmEucXVlcnlTZWxlY3RvckFsbCgiQWQiKSk7Yy5jPTAhPT1jLmEucXVlcnlTZWxlY3RvckFsbCgiQWRbc2VxdWVuY2VdIikubGVuZ3RoO2MuYyYmKGMuRD1jLmEucXVlcnlTZWxlY3RvckFsbCgiQWRbc2VxdWVuY2VdIikubGVuZ3RoKTtjLmw9MTxjLkxhLmxlbmd0aCYmIWMuYzticmVhaztjYXNlICJ2bWFwOnZtYXAiOmMuWT0hMDtjLmYoInByZXJvbGwiKTtjLmYoIm1pZHJvbGwiKTtjLmYoInBvc3Ryb2xsIik7Yy5MYS5sZW5ndGh8fGMuZigpO2JyZWFrO2Nhc2UgInBsYXlsaXN0IjpjLlc9ITA7Yy5tKCJQcmVyb2xsIik7Yy5tKCJNaWRyb2xsIik7Yy5tKCJQb3N0cm9sbCIpO2JyZWFrOwpkZWZhdWx0OnRocm93IGU9bmV3IEMoQy5nKSxjLmkucHVzaChuZXcgVGEoZSx7dmFzdDpjLmF9KSksZTt9Yy5MYS5sZW5ndGh8fChmPW5ldyBUYShuZXcgQyhDLmcpLHt9KSxmLmIoYy5JKCkpLGMuaS5wdXNoKGYpKTtyZXR1cm4gaC5yZXR1cm4oYy5BKCkpfSl9O1YucHJvdG90eXBlLkE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGMsZCxlO3JldHVybiBGYyhmdW5jdGlvbihmKXtpZigxPT1mLmEpe2lmKCEoYS5iLmxlbmd0aDxhLkQmJmEuTGEubGVuZ3RoKSl7Zi5hPTM7cmV0dXJufWM9YS5aO2Q9Yy5wdXNoO3JldHVybiBxYyhmLGEuVihhLkxhLnNoaWZ0KCkpLDQpfWlmKDMhPWYuYSlkLmNhbGwoYyxmLmIpLGYuYT0xO2Vsc2V7aWYoYS53YylyZXR1cm4gZi5yZXR1cm4oYSk7ZT1uZXcgQyhDLmMse2RldGFpbHM6Qy5hLk5kfSk7YS5aYygpJiYoZT1uZXcgQyhDLmMse2RldGFpbHM6Qy5hLm1kfSkpO2EuaS5wdXNoKG5ldyBUYShlLHt2YXN0OmEuYX0pKTt0aHJvdyBlO319KX07Vi5wcm90b3R5cGUuWmM9CmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuYi5sZW5ndGg7YysrKXRoaXMuYltjXS5aYygpJiYoYT0hMCk7cmV0dXJuIGF9O1YucHJvdG90eXBlLlY9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkLGU7cmV0dXJuIEZjKGZ1bmN0aW9uKGYpe2lmKDE9PWYuYSlyZXR1cm4gZD1uZXcgSWEoYSxhLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSkscWMoZixkLnBhcnNlKCkuY2F0Y2goZnVuY3Rpb24oaCl7cmV0dXJuIGh9KSwyKTtlPWYuYjtlIGluc3RhbmNlb2YgamE/Yy5iLnB1c2goZSk6ZSBpbnN0YW5jZW9mIFRhJiZjLmkucHVzaChlKTtyZXR1cm4gZi5yZXR1cm4oZCl9KX07Vi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXt2YXIgYz10aGlzOyhhP0FycmF5LmZyb20odGhpcy5hLnF1ZXJ5U2VsZWN0b3JBbGwoJ0FkQnJlYWtbYnJlYWtJZD0iJythKyciXScpKTpBcnJheS5mcm9tKHRoaXMuYS5xdWVyeVNlbGVjdG9yQWxsKCJBZEJyZWFrIikpKS5mb3JFYWNoKGZ1bmN0aW9uKGQsCmUpe3ZhciBmPWQucXVlcnlTZWxlY3RvcigiVkFTVEFkRGF0YSIpOyhkPWQucXVlcnlTZWxlY3RvcigiQWRUYWdVUkkiKSk/KGU9Yy5zKGQudGV4dENvbnRlbnQsZSksYSYmZS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixhKSxjLkxhLnB1c2goZSkpOmYmJkFycmF5LmZyb20oZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSkuZm9yRWFjaChmdW5jdGlvbihoKXthJiZoLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLGEpO2MuTGEucHVzaChoKX0pfSl9O1YucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcztBcnJheS5mcm9tKHRoaXMuYS5xdWVyeVNlbGVjdG9yQWxsKGEpKS5mb3JFYWNoKGZ1bmN0aW9uKGQsZSl7aWYoZD1kLnF1ZXJ5U2VsZWN0b3IoIkFkIikpZT1jLnMoZC50ZXh0Q29udGVudCxlKSxlLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLGEpLGMuTGEucHVzaChlKX0pfTtWLnByb3RvdHlwZS5JPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPVtdO0FycmF5LmZyb20odGhpcy5hLnF1ZXJ5U2VsZWN0b3JBbGwoIkVycm9yIikpLmZvckVhY2goZnVuY3Rpb24oZCl7aWYoZCl7dmFyIGU9CmQuZ2V0QXR0cmlidXRlKCJpZCIpfHxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7Yy5wdXNoKHtpZDplLHR5cGU6ImVycm9yIix1cmw6ZC50ZXh0Q29udGVudCxyZXF1ZXN0OmEuSyhkLnRleHRDb250ZW50KX0pfX0pO3JldHVybiBjfTtWLnByb3RvdHlwZS5LPWZ1bmN0aW9uKGEpe3JldHVybiBEYSYmImZ1bmN0aW9uIj09PXR5cGVvZiBEYS5vP0RhLm8oYSk6bmV3IFJlcXVlc3QoYSx7bWV0aG9kOiJHRVQifSl9O1YucHJvdG90eXBlLnM9ZnVuY3Rpb24oYSxjKXthPSc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjxWQVNUIHZlcnNpb249IjQuMCI+PEFkIHNlcXVlbmNlPSJbU0VRVUVOQ0VdIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBW1tVUkldXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+PC9WQVNUPicucmVwbGFjZSgiW1NFUVVFTkNFXSIsYy50b1N0cmluZygpKS5yZXBsYWNlKCJbVVJJXSIsYSk7cmV0dXJuKG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLAoidGV4dC94bWwiKS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZH07UWEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVi5wcm90b3R5cGUse3djOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiFhLmZlKCl9KS5sZW5ndGh9fSxCOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkxhLmxlbmd0aH19fSk7amEucHJvdG90eXBlLmZlPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmEubGVuZ3RofTtqYS5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuIDA8dGhpcy5hLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4gYS5jLmluY2x1ZGVzKGMudHlwZSl9KS5sZW5ndGh9O2phLnByb3RvdHlwZS5zPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztyZXR1cm4gdGhpcy5hLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4gYS5jLmluY2x1ZGVzKGMudHlwZSl9KVswXX07CmphLnByb3RvdHlwZS5iZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5jfTtqYS5wcm90b3R5cGUudT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuIHRoaXMuYS5maWx0ZXIoZnVuY3Rpb24oYyl7cmV0dXJuIWEuYy5pbmNsdWRlcyhjLnR5cGUpfSlbMF19O2phLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEpe3RoaXMuamE9dGhpcy5qYS5jb25jYXQoYSl9O2phLnByb3RvdHlwZS5aYz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuQy5xdWVyeVNlbGVjdG9yQWxsKCJNZXp6YW5pbmUiKSxjPSExO2EmJmEubGVuZ3RoJiYoYz0hMCk7cmV0dXJuIGN9O2phLnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7dHJ5e3ZhciBhPUViKHRoaXMuQy5xdWVyeVNlbGVjdG9yKCJEdXJhdGlvbiIpLnRleHRDb250ZW50LnNwbGl0KCI6IikpLGM9YS5uZXh0KCkudmFsdWUsZD1hLm5leHQoKS52YWx1ZSxlPWEubmV4dCgpLnZhbHVlO3JldHVybiAzNjAwKitjKzYwKitkKyArZX1jYXRjaChmKXtyZXR1cm4tMX19O2phLnByb3RvdHlwZS5GPQpmdW5jdGlvbigpe3ZhciBhPTAsYz0hMTt0cnl7Yz10aGlzLkMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYT1nLmouWWIoYyx0aGlzLmR1cmF0aW9uKSwwPmEmJihhPTApfWNhdGNoKGQpe2E9MH1yZXR1cm4gYX07amEucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy5DLnF1ZXJ5U2VsZWN0b3IoIkFkUGFyYW1ldGVycyIpO3JldHVybiBhP2EudGV4dENvbnRlbnQ6IiJ9Y2F0Y2goYyl7cmV0dXJuIiJ9fTtqYS5wcm90b3R5cGUubT1mdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLkMucXVlcnlTZWxlY3RvcigiQ2xpY2tUaHJvdWdoIik7cmV0dXJuIGE/YS50ZXh0Q29udGVudDoiIn1jYXRjaChjKXtyZXR1cm4iIn19O2phLnByb3RvdHlwZS5BPWZ1bmN0aW9uKCl7dHJ5e2lmKCF0aGlzLmcpZm9yKHZhciBhPXRoaXMuQy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmCjA8PWMuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuZz1hW2RdKTtyZXR1cm4gdGhpcy5nfWNhdGNoKGUpe3JldHVybiIifX07amEucHJvdG90eXBlLnpkPWZ1bmN0aW9uKCl7dHJ5e2lmKHRoaXMuaSlyZXR1cm4gdGhpcy5pO3ZhciBhPSIiLGM9dGhpcy5BKCk7YyYmYy5nZXRBdHRyaWJ1dGU/KGE9Yy5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuaT1hfWNhdGNoKGQpe3JldHVybiIifX07eShDLEVycm9yKTtDLm89e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsdmE6IlhNTF9QQVJTRV9FUlJPUiJ9O0MubD17dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsdmE6IkRVUkFUSU9OX0VSUk9SIn07Qy5nPXt0eXBlOiJlcnJvciIsCmNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsdmE6IkVNUFRZX1ZBU1QifTtDLkE9e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsdmE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9O0MuYj17dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKdmE6IkxPQURfRVJST1IifTtDLmk9e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHZhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn07Qy5tPXt0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHZhOiJNRURJQUZJTEVfRVJST1IifTtDLmY9e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsdmE6IkRVTU1ZX0FEIn07Qy5GPXt0eXBlOiJlcnJvciIsY29kZTotMSxtZXNzYWdlOiJ1bmtub3duIix2YToidW5rbm93biJ9O0MuYz17dHlwZToiZXJyb3IiLGNvZGU6NTU1LG1lc3NhZ2U6Im5vIHBsYXlhYmxlIGFkcyIsdmE6Ik5PX1BMQVlBQkxFX0FEUyJ9O0MuYT17TmQ6e3R5cGU6ImVycm9yIiwKY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsdmE6Ik5PX0FEUyJ9LFBkOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIix2YToiTk9fTUVESUFGSUxFUyJ9LG1jOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHZhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsdmE6IlZQQUlEX0lHTk9SRUQifSxtZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNSxtZXNzYWdlOiJvbmx5IG1lenphbmluZSIsdmE6Ik9OTFlfTUVaWkFOSU5FIn0sT2Q6e3R5cGU6ImhpbnQiLGNvZGU6LTEsbWVzc2FnZToibm8gZGV0YWlsIix2YToibm8gZGV0YWlsIn19O2lhLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEpe3ZhciBjPSExLGQ9MCxlPTA7YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCmM9ImZpeGVkIixkPWEubGVmdCxlPWEudG9wKTtkPXt4OmQseTplfTtkLnBvc2l0aW9uPWM7cmV0dXJuIGR9O2lhLnByb3RvdHlwZS5nZXRQb3NpdGlvbj1mdW5jdGlvbihhKXtpZih0aGlzLmwudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnUoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsZj10aGlzLkIoYSk7YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsCmQrPWEsdGhpcy5sLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5sLnBvc2l0aW9uSWZGaXhlZCkpO2M9e3g6Yyx5OmR9O2UmJihjLnBvc2l0aW9uPWUpO3JldHVybiBjfTtpYS5wcm90b3R5cGUuST1mdW5jdGlvbigpe3RoaXMuQT0hMH07aWEucHJvdG90eXBlLkQ9ZnVuY3Rpb24oKXt0aGlzLlMucGF1c2UoKTtsLmEodi5iLHRoaXMuUy5DYSgpKX07aWEucHJvdG90eXBlLkc9ZnVuY3Rpb24oKXt0aGlzLkF8fCh0aGlzLlMucGxheSgpLGwuYSh2LmcsdGhpcy5TLkNhKCkpKX07aWEucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O2cudi5iKCJ6SW5kZXgiKSYmKGE9Zy52LmIoInpJbmRleCIpKTt0aGlzLlMucGF1c2UoKTt0aGlzLmEuc3R5bGUuekluZGV4PWE7dGhpcy5hLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuYS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5hLnN0eWxlLmJveFNpemluZz10aGlzLlZhLnN0eWxlLmJveFNpemluZzt0aGlzLm0/CnRoaXMuYS5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDAsIDAsIDAsIC43NSkiOih0aGlzLmEuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIix0aGlzLmEuc3R5bGUud2lkdGg9dGhpcy5WYS5vZmZzZXRXaWR0aCswKyJweCIsdGhpcy5hLnN0eWxlLmhlaWdodD10aGlzLlZhLm9mZnNldEhlaWdodCswKyJweCIsdGhpcy5GKHRoaXMuVmEub2Zmc2V0V2lkdGgrMCx0aGlzLlZhLm9mZnNldEhlaWdodCswKSk7dGhpcy5nZXRQb3NpdGlvbih0aGlzLlZhKTt0aGlzLlMuV2ImJnRoaXMuUy5XYigpP3RoaXMuUy54YSgpLmFwcGVuZENoaWxkKHRoaXMuYSk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmEpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDEwKX07aWEucHJvdG90eXBlLmV4aXRGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7dGhpcy5TLmV4aXRGdWxsc2NyZWVuKCl9O2lhLnByb3RvdHlwZS5CPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSwKZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gZH07aWEucHJvdG90eXBlLnM9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXRQb3NpdGlvbihhKTtjLnBvc2l0aW9uP2MucG9zaXRpb249Yy5wb3NpdGlvbjpjLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy53aWR0aD1hLm9mZnNldFdpZHRoO2MuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O2lmKHRoaXMubSl7dmFyIGQ9d2luZG93O2M9ZG9jdW1lbnQ7dmFyIGU9Yy5kb2N1bWVudEVsZW1lbnQsZj1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07YT1kLmlubmVyV2lkdGh8fGUuY2xpZW50V2lkdGh8fGYuY2xpZW50V2lkdGg7ZD1kLmlubmVySGVpZ2h0fHxlLmNsaWVudEhlaWdodHx8Zi5jbGllbnRIZWlnaHQ7Yz1jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CmM9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIseDowLHk6TWF0aC5hYnMoYy55KSx3aWR0aDphLGhlaWdodDpkfX1yZXR1cm4gY307aWEucHJvdG90eXBlLm89ZnVuY3Rpb24oYSl7dGhpcy5TLkRkJiZnLmouVyh0aGlzLlMuY29udGFpbmVyKSYmKHRoaXMuUy5EZCgpLHRoaXMuVmE9dGhpcy5TLmNvbnRhaW5lcixhPSEwKTt2YXIgYz10aGlzLnModGhpcy5WYSk7aWYoYy54IT10aGlzLmIueHx8Yy55IT10aGlzLmIueXx8Yy5wb3NpdGlvbiE9dGhpcy5iLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLmIud2lkdGh8fGMuaGVpZ2h0IT10aGlzLmIuaGVpZ2h0fHxhfHxnLmouYigic3BpZWdlbCIpJiYuNT5NYXRoLnJhbmRvbSgpKXtpZigwPHRoaXMuYi53aWR0aCYmMDx0aGlzLmIuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5jKCk7cmV0dXJufXRoaXMuYj1jO3RoaXMuUy5XYigpPyh0aGlzLmEuc3R5bGUubGVmdD0iMHB4Iix0aGlzLmEuc3R5bGUudG9wPSIwcHgiKToodGhpcy5hLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuYS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuYS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5hLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuYS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuRihjLndpZHRoLGMuaGVpZ2h0KX1sLlcodGhpcy5hKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5vLmJpbmQodGhpcyksMTApfTtpYS5wcm90b3R5cGUuVWM9ZnVuY3Rpb24oYSl7dGhpcy5tPWF9O2lhLnByb3RvdHlwZS5GPWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBkPTA7ZDx0aGlzLmkubGVuZ3RoO2QrKyl0aGlzLmlbZF0oe3dpZHRoOmEsaGVpZ2h0OmN9KX07aWEucHJvdG90eXBlLlhjPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYX07aWEucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dGhpcy5pfHwodGhpcy5pPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5pLnB1c2goYSl9O2lhLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7dGhpcy5hJiYKdGhpcy5hLnBhcmVudE5vZGUmJnRoaXMuYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmEpfTttYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMuaT0hMDtmb3IodmFyIGEgaW4gdGhpcy5jKXtpZih0aGlzLmcpYnJlYWs7dmFyIGM9dGhpcy5jW2FdO3RoaXMubChjKSYmKHRoaXMuYi5wdXNoKGMpLHRoaXMuZihjKSl9fTttYi5wcm90b3R5cGUubD1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIEY/ITA6ITF9O21iLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3RoaXMubChhKSYmYS53KCl9O21iLnByb3RvdHlwZS5tPWZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBBKWZvcihnLlNjPWEsdGhpcy5nPSEwLGE9MDthPHRoaXMuYi5sZW5ndGg7YSsrKXRoaXMuYlthXSYmdGhpcy5iW2FdLmtjJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuYlthXS5rYyl9O21iLnByb3RvdHlwZS5hPWZ1bmN0aW9uKGEsCmMpe2lmKCF0aGlzLmd8fGMpdGhpcy5iLnB1c2goYSksdGhpcy5mKGEpfTt2YXIgVD1uZXcgbWI7VC53KCk7Ri5wcm90b3R5cGUudz1mdW5jdGlvbigpe307Ri5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuRjw9dGhpcy5sPyh0aGlzLkYrKyx0aGlzLmtjPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDEwMCkpOjA+dGhpcy5sJiYodGhpcy5rYz13aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwxMDApKX07Ri5wcm90b3R5cGUuTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLkY+dGhpcy5sPyEwOiExfTtGLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dGhpcy5GPTB9O0YucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In07Ri5wcm90b3R5cGUuST1mdW5jdGlvbihhKXt0aGlzLmE9YX07Ri5wcm90b3R5cGUuaT1mdW5jdGlvbihhKXt0aGlzLmZbYS55YSgpXT1hO1QmJlQuaSYmVC5tKGEpfTtGLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEpe3ZhciBjPQphLlIoKSxkO2ZvcihkIGluIHRoaXMuZilpZihjPT10aGlzLmZbZF0uUigpKXJldHVybiEwO3JldHVybiB0aGlzLmZbYS55YSgpXT8hMDohMX07Ri5wcm90b3R5cGUuRz1mdW5jdGlvbihhKXthPWEueGEoKTtmb3IodmFyIGMgaW4gdGhpcy5mKXRyeXt2YXIgZD10aGlzLmZbY10ueGEoKTtpZihhLmlkPT0oZD9kLmlkOiIiKSlyZXR1cm4hMH1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX1yZXR1cm4hMX07QS5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifTtBLnByb3RvdHlwZS5DYT1mdW5jdGlvbigpe3ZhciBhPXt9LGM9dGhpcy5SKCksZD10aGlzLnhhKCksZT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YylhLnZpZGVvVGFnSWQ9Yy5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDtlJiYoYS5wbGF5ZXI9ZSk7cmV0dXJuIGF9O0EucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXt9O0EucHJvdG90eXBlLk1hPWZ1bmN0aW9uKCl7fTtBLnByb3RvdHlwZS5IZT0KZnVuY3Rpb24oYSl7dGhpcy5jPWF9O0EucHJvdG90eXBlLkdlPWZ1bmN0aW9uKGEpe3RoaXMuRj1hfTtBLnByb3RvdHlwZS5iZD1mdW5jdGlvbigpe307QS5wcm90b3R5cGUuaXNGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuITF9O0EucHJvdG90eXBlLmV4aXRGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCkuY2F0Y2goZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX07QS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX07CkEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfTtBLnByb3RvdHlwZS55YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfTtBLnByb3RvdHlwZS5vPWZ1bmN0aW9uKGEpe3RoaXMuaWQ9YX07QS5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXthJiYodGhpcy52aWRlb1RhZz1hLHRoaXMuRCgpfHx0aGlzLkIoKSx0aGlzLm8odGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpKX07QS5wcm90b3R5cGUuUj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfTtBLnByb3RvdHlwZS5CPWZ1bmN0aW9uKCl7dmFyIGE9bC5nKDEwKTt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGEpfTtBLnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUigpLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX07QS5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXt0aGlzLmNvbnRhaW5lcj1hfTtBLnByb3RvdHlwZS54YT1mdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT0KdHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9O0EucHJvdG90eXBlLmdldFJhd1BsYXllcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn07QS5wcm90b3R5cGUuJGM9ZnVuY3Rpb24oKXtyZXR1cm4hMH07QS5wcm90b3R5cGUuaXNQbGF5aW5nPWZ1bmN0aW9uKCl7cmV0dXJuITB9O0EucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5SKCk7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfTtBLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO3JldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH07QS5wcm90b3R5cGUuSGE9ZnVuY3Rpb24oKXtyZXR1cm4hMX07QS5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3RoaXMuaT0hMH07QS5wcm90b3R5cGUuV2I9ZnVuY3Rpb24oKXt2YXIgYT1nLnYuYTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/CiEwOiExfTtBLnByb3RvdHlwZS5FYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO3JldHVybiBhJiZhLm11dGVkP2EubXV0ZWQ6ITF9O0EucHJvdG90eXBlLnJlPWZ1bmN0aW9uKCl7cmV0dXJuITF9O0EucHJvdG90eXBlLmpkPWZ1bmN0aW9uKGEpe3RoaXMuZmM9YX07QS5wcm90b3R5cGUuZWQ9ZnVuY3Rpb24oKXt0aGlzLmZjPW51bGx9O0EucHJvdG90eXBlLldjPWZ1bmN0aW9uKCl7cmV0dXJuITF9O0UucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt9O0UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXt0aGlzLmZhfHwodGhpcy5mYT0hMCxsLm1hKCkpfTtFLnByb3RvdHlwZS5uYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGM9bmV3IENhO3dpbmRvd1tjLmEoKV18fCh3aW5kb3dbYy5hKCldPXt9KTt3aW5kb3dbYy5hKCldW2EueWEoKV18fCh3aW5kb3dbYy5hKCldW2EueWEoKV09e30sd2luZG93W2MuYSgpXVthLnlhKCldLmluaXRpYXRvcj1sLkQoKSk7d2luZG93W2MuYSgpXVthLnlhKCldW2wuRCgpXT8Kd2luZG93W2MuYSgpXVthLnlhKCldW2wuRCgpXSsrOndpbmRvd1tjLmEoKV1bYS55YSgpXVtsLkQoKV09MX07RS5wcm90b3R5cGUucGE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcixjPSEwLGQ9bmV3IENhO3dpbmRvd1tkLmEoKV0mJndpbmRvd1tkLmEoKV1bYS55YSgpXSYmd2luZG93W2QuYSgpXVthLnlhKCldLmluaXRpYXRvciE9bC5EKCkmJih0aGlzLlUoKSxjPSExKTtyZXR1cm4gY307RS5wcm90b3R5cGUuYT1mdW5jdGlvbihhLGMpe3ZhciBkPSEwO2EmJihkPSExKTt0aGlzLmkoKXx8KHRoaXMubmEoKSx0aGlzLnBhKCk/KHRoaXMuVSgpLHRoaXMuVih0aGlzLnBsYXllcixkKSx0aGlzLmhhKCksYyYmImZ1bmN0aW9uIj09dHlwZW9mIGMmJmMoKSk6KGwudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKSx0aGlzLlUoKSkpfTtFLnByb3RvdHlwZS5KPWZ1bmN0aW9uKGEsYyl7dGhpcy5pKCl8fCh0aGlzLm0ucHVzaChhKSx0aGlzLmwucHVzaCh7cmVhc29uOmEsCmRldGFpbDpjfSkpfTtFLnByb3RvdHlwZS5oYT1mdW5jdGlvbigpe3ZhciBhPSJ1bmtub3duIixjPVtdO3RoaXMubSYmMDx0aGlzLm0ubGVuZ3RoJiYodGhpcy5tPWwudW5pcXVlKHRoaXMubSksbC50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMubS5qb2luKCIsIikpKTtpZih0aGlzLmwpe2Zvcih2YXIgZD0wO2Q8dGhpcy5sLmxlbmd0aDtkKyspdGhpcy5BW3RoaXMubFtkXS5yZWFzb25dPT10aGlzLkFbYV0mJmMucHVzaCh0aGlzLmxbZF0uZGV0YWlsKSx0aGlzLkFbdGhpcy5sW2RdLnJlYXNvbl08dGhpcy5BW2FdJiYoYz1bXSxjLnB1c2godGhpcy5sW2RdLmRldGFpbCksYT10aGlzLmxbZF0ucmVhc29uKTt0aGlzLkFbYV18fChhPSJ1bmtub3duIixjPVtdKTswPGMubGVuZ3RoJiYoYz1sLnVuaXF1ZShjKSxhPWErIi0iK2Muam9pbigiLSIpKTtsLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfX07RS5wcm90b3R5cGUuTT1mdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWX07CkUucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlhfTtFLnByb3RvdHlwZS56YT1mdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2F9O0UucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkZ9O0UucHJvdG90eXBlLmJhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLll9O0UucHJvdG90eXBlLmk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuRn07RS5wcm90b3R5cGUuZ2E9ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YX07RS5wcm90b3R5cGUud2E9ZnVuY3Rpb24oYSl7dGhpcy5WPWF9O3kobGIsQSk7bGIucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuYihhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5nKGEpO3RoaXMuS2E9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuS2E9CiEwfS5iaW5kKHRoaXMpKX07bGIucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfTtsYi5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfTtsYi5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn07eShMYixFKTtMYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLGM9YS5rZjtjP2MuSWE/Yy5JYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihkKXt2YXIgZT0hMSxmPSIiO2QuZ2V0RXJyb3ImJihlPWQuZ2V0RXJyb3IoKSk7ZXx8ZC5kZXRhaWwuZ2V0RXJyb3ImJihlPWQuZGV0YWlsLmdldEVycm9yKCkpO2UuZ2V0RXJyb3JDb2RlJiYoZis9ZS5nZXRFcnJvckNvZGUoKSk7ZS5nZXRNZXNzYWdlJiYoZis9ZS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD0KZi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMuTSgpLHRoaXMuYigpKToodGhpcy5KKCJhZGVycm9yIiksdGhpcy5jKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpLDEwMCk6YS5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLkooImZyYW1ld29yayIpLHRoaXMuYygpKX07TGIucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5LYT90aGlzLmEoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwKX07eShpYyxGKTtpYy5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBhPW5ldyBsYih3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pOwp0aGlzLmIoYSl8fCh0aGlzLmkoYSksKG5ldyBMYihhLHRoaXMuYSkpLncoKSl9dGhpcy5nKCl9O3ZhciBMYz1uZXcgaWMoWCk7VC5hKExjKTt5KGxhLEEpO2xhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9bC5jKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2EuYXV0aG9yaXR5JiZhLmF1dGhvcml0eS5pbmRleE9mJiYwPD1hLmF1dGhvcml0eS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJih0aGlzLmY9ITApO3RoaXMuVGMoKTt0aGlzLnVjKCk7YT0hMDt0aGlzLnBsYXllci5nZXRDb25maWcmJihhPXRoaXMucGxheWVyLmdldENvbmZpZygpKTthfHwodGhpcy5TYT0hMCl9O2xhLnByb3RvdHlwZS5UYz1mdW5jdGlvbigpe3RoaXMuU2E9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLlNhPSEwKTshYS5ub2RlTmFtZXx8Ik9CSkVDVCIhPWEubm9kZU5hbWUmJiJWSURFTyIhPWEubm9kZU5hbWV8fChhPWEucGFyZW50Tm9kZSk7dGhpcy5sPQphO2lmKHRoaXMuZil7dGhpcy51YygpO2lmKHRoaXMuU2EpcmV0dXJuO2E9dGhpcy5SKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlfXRoaXMuYihhKX07bGEucHJvdG90eXBlLnVjPWZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Epe3ZhciBhPXRoaXMubCxjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2N8fCh0aGlzLlNhPSEwKTt0aGlzLmcoYyk7Zy52LmIoInVzZV92aWRlb3RhZ19hc19jb250YWluZXIiKSYmdGhpcy5iKGMpfX07bGEucHJvdG90eXBlLk1hPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoZy52LmIoInBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCIpKWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5jJiYoMCx0aGlzLmMpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmCmEuX2V2ZW50cy50aW1lJiZhLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGMpe2MuZHVyYXRpb24mJmMucG9zaXRpb24mJjE+Yy5kdXJhdGlvbi1jLnBvc2l0aW9uJiZ0aGlzLmMmJigwLHRoaXMuYykoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGMpe2MuZHVyYXRpb24mJmMucG9zaXRpb24mJjE+Yy5kdXJhdGlvbi1jLnBvc2l0aW9uJiZ0aGlzLmMmJigwLHRoaXMuYykoKX0uYmluZCh0aGlzKSl9O2xhLnByb3RvdHlwZS5EZD1mdW5jdGlvbigpe3RoaXMuVGMoKTt0aGlzLnVjKCl9O2xhLnByb3RvdHlwZS5iZD1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihjKXt0aGlzLm0oYyl9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihjKXt0aGlzLm0oYyl9LmJpbmQodGhpcykpfTsKbGEucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5wbGF5ZXI7Yy5nZXRQb3NpdGlvbigpO2MuZ2V0UG9zaXRpb24oKTtjLmdldER1cmF0aW9uKCk7Yy5nZXRQb3NpdGlvbigpO2MuZ2V0RHVyYXRpb24oKTtjLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYy5nZXRQb3NpdGlvbiYmMzA8Yy5nZXRQb3NpdGlvbigpJiYzMDxjLmdldER1cmF0aW9uKCktYy5nZXRQb3NpdGlvbigpJiZ0aGlzLkYmJigwLHRoaXMuRikoKX07bGEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMuUigpLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfTtsYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9OwpsYS5wcm90b3R5cGUuSGE9ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfTtsYS5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifTtsYS5wcm90b3R5cGUuZXhpdEZ1bGxzY3JlZW49ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX07bGEucHJvdG90eXBlLkVhPWZ1bmN0aW9uKCl7dmFyIGE9ITEsYz10aGlzLnBsYXllcjtjLmdldE11dGUmJmMuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9O2xhLnByb3RvdHlwZS5XYz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGM9ITE7YS5nZXRWb2x1bWUmJmEuZ2V0Vm9sdW1lKCkmJihjPWEuZ2V0Vm9sdW1lKCkpO3JldHVybiBjfTt5KGZiLEUpO2ZiLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dGhpcy5hYT0iYWRDbGljayBhZENvbXBsZXRlIGFkRXJyb3IgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFJlcXVlc3QgYWRTa2lwcGVkIGFkVGltZSBiZWZvcmVDb21wbGV0ZSBiZWZvcmVQbGF5IGMgY2FzdCBjb21wbGV0ZSBlbSBmaXJzdEZyYW1lIGwgaWRsZSBsZXZlbHMgbWV0YSBwbGF5IHBsYXlsaXN0Q29tcGxldGUgcmVhZHkgcmVzaXplIHNlZWsgc2ggdGltZSIuc3BsaXQoIiAiKX07CmZiLnByb3RvdHlwZS5nPWZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5GO3RoaXMuaXNQbGF5aW5nPXRoaXMuST10aGlzLlc9ITE7dGhpcy5HPTE7dGhpcy5LPTA7dGhpcy5zPVtdO3RoaXMuZj0hMX07ZmIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7Zy5qLmIoInNwaWVnZWwuZGUiKSYmZy5qLnNhKCkudGhlbihmdW5jdGlvbihmKXtmJiYoYS5QPSEwLGEub3x8Yy5wbHVnaW5zLnZhc3QuZGVzdHJveSgpLGwudHJhY2soInN0YXRzX2hkX3Rha2VvdmVyIiwhYS5vLCEwKSl9KS5jYXRjaChmdW5jdGlvbigpe30pOy0xIT09d2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigidmVydGljYWxpenIiKSYmLTEhPT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCImZm9yY2UiKSYmYy5wbHVnaW5zLnZhc3QuZGVzdHJveSgpO2lmKGcuai5NYigpJiZnLmouTigpKXt2YXIgZD1mdW5jdGlvbigpe3RoaXMubz9nLmoudHJhY2soInZydGNsenJfdGFrZW92ZXIiLAohMSwhMCk6KGcuai50cmFjaygidnJ0Y2x6cl90YWtlb3ZlciIsITAsITApLGMucGx1Z2lucy52YXN0LmRlc3Ryb3koKSxnLkJjPXRoaXMuQmMsYy5vbigicGxheSIsZnVuY3Rpb24oKXtjLm11dGVkQXV0b3N0YXJ0fHx0aGlzLkR8fChnLmoudHJhY2soInZydGNsenJfZGVsaXZlciIsInBsYXkiLCEwKSx0aGlzLmMoKSx0aGlzLkQ9ITApfS5iaW5kKHRoaXMpKSxjLm9uKCJtdXRlIixmdW5jdGlvbihmKXshYy5tdXRlZEF1dG9zdGFydHx8Zi5tdXRlfHx0aGlzLkR8fChnLmoudHJhY2soInZydGNsenJfZGVsaXZlciIsIm11dGUiLCEwKSx0aGlzLmMoKSx0aGlzLkQ9ITApfS5iaW5kKHRoaXMpKSl9LmJpbmQodGhpcyk7dGhpcy5CYz1uZXcgUihkKX1lbHNle3ZhciBlPXt9O2lmKGMuZ2V0Q29uZmlnKWlmKGU9Yy5nZXRDb25maWcoKSxlLmFkdmVydGlzaW5nKXtpZihlLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmCmUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkc9ZS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLmY9ITApO2Vsc2V7aWYoZS5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcihkPTA7ZDxlLmFkdmVydGlzaW5nLnNjaGVkdWxlLmxlbmd0aDtkKyspaWYoZS5hZHZlcnRpc2luZy5zY2hlZHVsZVtkXS50YWcpe3RoaXMuZj0hMDticmVha31lLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmY9ITApO2UuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmZS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuZj0hMCl9ZS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmY9ITApfWVsc2UgdGhpcy5NKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtlPSJhZFBsYXkgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUgYWRDb21wbGV0ZSIuc3BsaXQoIiAiKTsKZm9yKGQ9MDtkPGUubGVuZ3RoO2QrKyljLm9uKGVbZF0sZnVuY3Rpb24oZil7dmFyIGg9dGhpczt0aGlzLm89ITA7dGhpcy5NKGYudHlwZSk7ImFkUGxheSI9PT1mLnR5cGUmJmcuai5iKCJzcGllZ2VsLmRlIikmJmcuai5zYSgpLnRoZW4oZnVuY3Rpb24obSl7bSYmZy5qLnRyYWNrKCJzdGF0c19oZF90YWtlb3Zlcl9jYyIsaC5QLCEwKX0pLmNhdGNoKGZ1bmN0aW9uKCl7fSk7ImFkQ29tcGxldGUiPT09Zi50eXBlJiYodGhpcy5JPSEwKX0uYmluZCh0aGlzKSk7Yy5vbigiYWRFcnJvciIsZnVuY3Rpb24oZil7dGhpcy5vbkFkRXJyb3IoZil9LmJpbmQodGhpcykpO2Mub24oInRpbWUiLGZ1bmN0aW9uKGYpe3RoaXMuaXNQbGF5aW5nPSEwOzMwPGYuZHVyYXRpb24mJiF0aGlzLmkoKSYmIWMubXV0ZWRBdXRvc3RhcnQmJih0aGlzLmY/KHRoaXMuSigiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuYygpKToodGhpcy5KKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLwoxRTMpKSx0aGlzLmMoITApKSl9LmJpbmQodGhpcykpO2Mub24oInBsYXlsaXN0aXRlbSIsZnVuY3Rpb24oKXtpZih0aGlzLmkoKSYmKHRoaXMuZygpLHRoaXMucGxheWVyLnhkPSEwLGNvbmYuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGY9dGhpcy5wbGF5ZXIuZmM7ZiYmKGYuamMoKSxmLnRjKCkpfX0uYmluZCh0aGlzKSl9fTtmYi5wcm90b3R5cGUub25BZEVycm9yPWZ1bmN0aW9uKGEpe3RoaXMuTnx8KHRoaXMuTj1bXSk7dGhpcy5OLnB1c2goe2NvZGU6YS5jb2RlLG1zZzphLm1lc3NhZ2V9KTt0aGlzLksrKzt2YXIgYz1hLnRhZzstMT09dGhpcy5zLmluZGV4T2YoYykmJnRoaXMucy5wdXNoKGMpOyIxMDEiPT1hLmNvZGV8fCIxMDAxIj09YS5jb2RlP2wuYWEoKT8obC51PSEwLHRoaXMuSigiYWRlbXB0eSIsYS5jb2RlKSx0aGlzLmMoKSk6KHRoaXMuTSgpLHRoaXMuYigpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMuTSgiZW1wdHkiKToKMzAzPT1hLmNvZGUmJi0xIT1hLm1lc3NhZ2UuaW5kZXhPZigiZW1wdHkiKT90aGlzLk0oImVtcHR5Iik6KHRoaXMuSigiYWRlcnJvciIsYS5jb2RlKSx0aGlzLnMubGVuZ3RoPj10aGlzLkcmJnRoaXMuYygpKX07ZmIucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7KGE9dm9pZCAwPT09YT8hMTphKT90aGlzLkI/dGhpcy5CKys6dGhpcy5CPTE6dGhpcy51P3RoaXMudSsrOnRoaXMudT0xO3ZhciBjPXRoaXMucGxheWVyO2lmKGwuVyhjLlIoKSkpaWYoYy5TYSl0aGlzLk0oInBsYXllciBpcyBpbnZhbGQiKTtlbHNle3ZhciBkPWZ1bmN0aW9uKCl7dGhpcy51PnRoaXMuQiYmKGE9ITEpO3RoaXMuYShhKX0uYmluZCh0aGlzKTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5vbigidGltZSIsZnVuY3Rpb24oZSl7LjU+ZS5wb3NpdGlvbiYmISgwPmUucG9zaXRpb24mJjA+ZS5kdXJhdGlvbil8fHRoaXMuT3x8KHRoaXMuTz0hMCxkKCkpfS5iaW5kKHRoaXMpKX1lbHNlIGMuVGMoKSxjLnVjKCksCmMuU2F8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKGEpfS5iaW5kKHRoaXMpLDIwKX07eShDYixGKTtDYi5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXt2YXIgYz1GLnByb3RvdHlwZS5iLmNhbGwodGhpcyxhKTthPWEucGxheWVyO2lmKCFjJiZhKWZvcih2YXIgZCBpbiB0aGlzLmYpdGhpcy5mW2RdLnBsYXllcj09YSYmKGM9ITApO3JldHVybiBjfTtDYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPWwuYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5jKCl8fCFhLmF1dGhvcml0eXx8IWEuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7CmlmKCghd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpJiZ3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpKXthPVtdO2lmKDE8Yy5sZW5ndGgpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspYS5wdXNoKGNbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWQ9bmV3IGxhKHdpbmRvdy5qd3BsYXllcihhW2NdKSksbnVsbD09ZC5pZCYmbnVsbD09ZC5jb250YWluZXImJm51bGw9PWQudmlkZW9UYWd8fGQuU2F8fHRoaXMuYihkKXx8dGhpcy5HKGQpfHwodGhpcy5pKGQpLGQ9bmV3IGZiKGQsdGhpcy5hKSxkLlQoKSxkLncoKSl9dGhpcy5nKCl9fTtDYi5wcm90b3R5cGUuYz1mdW5jdGlvbigpe3ZhciBhPWwuYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKcmV0dXJuIGwuQihhLmFuY2hvcil9O3ZhciBNYz1uZXcgQ2IoWCk7VC5hKE1jKTt5KEJhLEEpO0JhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYz1hLmVsXztjfHwoYz1hLmVsKCkpO2M/KHRoaXMuYihjKSwoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5nKGEpOnRoaXMuYSgpKTp0aGlzLmEoKX1lbHNlIHRoaXMuYSgpfTtCYS5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9O0JhLnByb3RvdHlwZS5NYT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcykpfTtCYS5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYz1hLmN1cnJlbnRUaW1lKCk7YT1hLmR1cmF0aW9uKCk7CmMmJjA8YyYmYSYmMDxhJiZjPj1hLTImJnRoaXMuYyYmdGhpcy5jKCl9O0JhLnByb3RvdHlwZS4kYz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGM9SlNPTi5wYXJzZShhKTtpZihjLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFjWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZCl7fWE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGEuYXV0b3BsYXk/YS5hdXRvcGxheSgpOiExfTtCYS5wcm90b3R5cGUuRWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9O0JhLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH07QmEucHJvdG90eXBlLmlzUGxheWluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfTsKQmEucHJvdG90eXBlLmV4aXRGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxjPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBjKXRyeXtjPWMoKX1jYXRjaChkKXtjPSExfWMmJmEuZXhpdEZ1bGxzY3JlZW4oKX07QmEucHJvdG90eXBlLmN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9O3koZmEsRSk7ZmEucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLlg9dGhpcy5YfHwhMTt0aGlzLnNhKHRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKXx8KHRoaXMuZWEoKSx0aGlzLmxhKCksdGhpcy5CKCkpfTtmYS5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGwuYigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfTtmYS5wcm90b3R5cGUucz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpOwphLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT1hLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGMpe319cmV0dXJuIHRoaXMuaW1hfTtmYS5wcm90b3R5cGUuTz1mdW5jdGlvbigpe2lmKCF0aGlzLklhKXt2YXIgYT10aGlzLnMoKTthJiYoYS5hZHNMb2FkZXImJih0aGlzLklhPWEuYWRzTG9hZGVyKSxhLl9hZHNMb2FkZXImJih0aGlzLklhPWEuX2Fkc0xvYWRlciksYS5nZXRBZHNMb2FkZXImJih0aGlzLklhPWEuZ2V0QWRzTG9hZGVyKSxhLmNvbnRyb2xsZXImJmEuY29udHJvbGxlci5zZGtJbXBsJiZhLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJgoodGhpcy5JYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5JYX07ZmEucHJvdG90eXBlLlo9ZnVuY3Rpb24oKXtpZighdGhpcy51KXt2YXIgYT10aGlzLnMoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy51PWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy51PWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMudX07ZmEucHJvdG90eXBlLnFhPWZ1bmN0aW9uKCl7aWYoIXRoaXMuUCl7dmFyIGE9dGhpcy5zKCksYz10aGlzLm9hKCk7d2luZG93LmltYSYmYSYmKGEuX2Fkc0xvYWRlcnx8YS5hZHNMb2FkZXJ8fGMpJiYodGhpcy5QPSEwKX1yZXR1cm4gdGhpcy5QfTtmYS5wcm90b3R5cGUub2E9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTshdGhpcy5OJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5OPSEwKTtyZXR1cm4gdGhpcy5OfTtmYS5wcm90b3R5cGUuQj1mdW5jdGlvbigpe3ZhciBhPQp0aGlzLk8oKTtpZihhKXt2YXIgYz0iYWRFcnJvciIsZD0iYWRzTWFuYWdlckxvYWRlZCIsZT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGU9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oZil7dGhpcy5mKGYpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMudGEoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oZil7dGhpcy5mKGYpO3RoaXMuSigiYWRlcnJvciIsdGhpcy5YKTt0aGlzLmMoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmkoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkIoKX0uYmluZCh0aGlzKSwyMCl9O2ZhLnByb3RvdHlwZS50YT1mdW5jdGlvbigpe3RoaXMuRz0hMDt2YXIgYT10aGlzLlooKTtpZihhfHx0aGlzLmkoKSl7dmFyIGM9CiJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7YS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oZil7dGhpcy5mKGYpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihmKXt0aGlzLmYoZik7dGhpcy5KKCJhZGVycm9yIix0aGlzLlgpO3RoaXMuYyghMCl9LmJpbmQodGhpcykpO3ZhciBlPSIiO2wucmEoKSYmKGU9Ik1fIik7YS5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsCmZ1bmN0aW9uKCl7bC5iKCJjaGlwLmRlIikmJmwudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vPSEwO2wuYigiY2hpcC5kZSIpJiZsLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5vPSEwO2lmKGwuYigiY2hpcC5kZSIpKXt2YXIgZj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTtsLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsibWlkcG9pbnQiLCIiLCEwKTtsLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCghZi5wYXVzZWQoKSkudG9TdHJpbmcoKSwhMCl9fS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vPSEwO2wuYigiY2hpcC5kZSIpJiYKbC50cmFjaygic3RhdHNfY3VzdF8iK2UrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm89ITA7bC5iKCJjaGlwLmRlIikmJmwudHJhY2soInN0YXRzX2N1c3RfIitlKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5vPSEwO2wuYigiY2hpcC5kZSIpJiZsLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLm98fCh0aGlzLkooImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmMoKSx0aGlzLksoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkIoKX0uYmluZCh0aGlzKSwyMCl9O2ZhLnByb3RvdHlwZS5sYT0KZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYyl7dGhpcy5mKGMpO3RoaXMuYygpO3RoaXMuSigiYWRlcnJvciIsdGhpcy5YKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMuYyghMCk7dGhpcy5KKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihjKXt0aGlzLmYoYyk7dGhpcy5jKCk7dGhpcy5KKCJhZGVycm9yIix0aGlzLlgpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYyl7dGhpcy5mKGMpO3RoaXMuYygpO3RoaXMuSigiYWRlcnJvciIsdGhpcy5YKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYyl7dGhpcy5mKGMpO3RoaXMuYygpO3RoaXMuSigiYWRlcnJvciIsdGhpcy5YKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLk0oKX0uYmluZCh0aGlzKSl9O2ZhLnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGcuSCYmZy5ILmIpZy5ILkphJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGMpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSw1MCkpfTtmYS5wcm90b3R5cGUuZWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLnFhKCkpe3ZhciBjPXRoaXMucygpLGQ9dGhpcy5PKCk7YyYmZCYmKHRoaXMuR3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkc/CnRoaXMuTSgpOih0aGlzLmMoITApLHRoaXMuSigibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMuZGE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnMoKSxmPXRoaXMuTygpO2UmJiFmPyh0aGlzLkooIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuYygpKToodGhpcy5jKCEwKSx0aGlzLkooIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5kYT0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMuaSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSw1MCl9O2ZhLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoZixoKXt2YXIgbT0hMTtpZihmKXtpZigxMDA5PT1mfHwzMDM9PWZ8fDQwMz09ZiltPSEwO218fCFmLmluZGV4T2Z8fC0xPT09Zi5pbmRleE9mKCIxMDA5IikmJi0xPT09CmYuaW5kZXhPZigiMzAzIikmJi0xPT09Zi5pbmRleE9mKCI0MDMiKXx8KG09ITApOyJudW1iZXIiPT10eXBlb2YgZiYmKGguWD1mLGguSigiYWRlcnJvciIsZikpfXJldHVybiBtfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmMoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5XKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZjKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5XKCk7YnJlYWt9fTtmYS5wcm90b3R5cGUuVz0KZnVuY3Rpb24oKXt0aGlzLm1hKCk/KHRoaXMuST0hMCxsLnU9bC5hYSgpLHRoaXMuYWE9IWwudSx0aGlzLksoITApKToodGhpcy5JPSEwLHRoaXMuTSgiZW1wdHkgdmFzdCIpKX07ZmEucHJvdG90eXBlLm1hPWZ1bmN0aW9uKCl7cmV0dXJuIDA8PWwuRyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5YPyEwOmwuYWEoKX07ZmEucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkk/KGwudXx8dGhpcy5NKCksdGhpcy5iKCkpOnRoaXMuSyhhKX0uYmluZCh0aGlzKSwxMDApfTtmYS5wcm90b3R5cGUuSz1mdW5jdGlvbihhKXt0aGlzLmkoKXx8KHZvaWQgMCE9PWEmJmF8fCh0aGlzLmFhPSExKSx0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmEodGhpcy5hYSxmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfTsKeShCYixGKTtCYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpO3ZhciBjPXRoaXMuYyh3aW5kb3cpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXRyeXtjPWN8fHRoaXMuYyhhW2RdKX1jYXRjaChlKXt9dGhpcy5nKCl9fTtCYi5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYz1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2M9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYz1hLnZpZGVvanMucGxheWVycyk7MD09Yy5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYy5wdXNoKGEpKTtpZigwPGwuemEoYykpe2Zvcih2YXIgZCBpbiBjKWMuaGFzT3duUHJvcGVydHkoZCkmJgooYT1uZXcgQmEoY1tkXSksYS5pfHx0aGlzLmIoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuaShhKSwobmV3IGZhKGEsdGhpcy5hKSkudygpKSk7cmV0dXJuITB9cmV0dXJuITF9O0JiLnByb3RvdHlwZS5nPWZ1bmN0aW9uKCl7dGhpcy5rYz13aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwxMDApfTt2YXIgTmM9bmV3IEJiKFgpO1QuYShOYyk7eShBYSxBKTtBYS5wcm90b3R5cGUuVD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS51aSYmYS51aS50YWdBdHRyaWJ1dGVzP2EudWkudGFnQXR0cmlidXRlcy5pZD8oYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnVpLnRhZ0F0dHJpYnV0ZXMuaWQpKT8odGhpcy5iKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuZyhhKTp0aGlzLmEoKSk6dGhpcy5hKCk6dGhpcy5hKCk6dGhpcy5hKCl9O0FhLnByb3RvdHlwZS5sPWZ1bmN0aW9uKGEpe3RoaXMuZj0KYX07QWEucHJvdG90eXBlLkVhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWQ/ITA6ITF9O0FhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX07QWEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX07QWEucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkfTtBYS5wcm90b3R5cGUuSGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQ/ITE6KHRoaXMucGF1c2UoKSwhMCl9O0FhLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfTtBYS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn07QWEucHJvdG90eXBlLmNhPQpmdW5jdGlvbigpe3JldHVybiJUSEVPcGxheWVyIn07eShBYixFKTtBYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO2EuYWRzJiZhLmFkcy5hZGRFdmVudExpc3RlbmVyJiZhLmFkcy5hZGRFdmVudExpc3RlbmVyKCJhZGVycm9yIixmdW5jdGlvbihjKXtjPWMuZXJyb3JDb2RlOzEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jP3RoaXMuYigpOih0aGlzLkooImFkZXJyb3IiLGMpLHRoaXMuYygpKX0uYmluZCh0aGlzKSk7dGhpcy5mKCl9O0FiLnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7YS5hZHMmJmEuYWRzLmN1cnJlbnRBZHMmJjA8YS5hZHMuY3VycmVudEFkcy5sZW5ndGgmJmEuYWRzLnBsYXlpbmc/dGhpcy5NKCk6IXRoaXMucGxheWVyLmlzUGF1c2VkKCkmJi4yPHRoaXMucGxheWVyLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5jKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwKMTAwKX07QWIucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7dGhpcy5wbGF5ZXIuaXNQYXVzZWQoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYyhhKX0uYmluZCh0aGlzKSw1MCk6dGhpcy5hKGEpfTt5KGhjLEYpO2hjLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7aWYod2luZG93LlRIRU9wbGF5ZXImJndpbmRvdy5USEVPcGxheWVyLnBsYXllcnMpZm9yKHZhciBhIGluIHdpbmRvdy5USEVPcGxheWVyLnBsYXllcnMpe3ZhciBjPXdpbmRvdy5USEVPcGxheWVyLnBsYXllcnNbYV07Yy5wbGF5JiYoYz1uZXcgQWEoYyksYy5pfHx0aGlzLmIoYyl8fCh0aGlzLmkoYyksYy5sKHRoaXMuYSksKG5ldyBBYihjLHRoaXMuYSkpLncoKSkpfXRoaXMudSgpO3RoaXMuZygpfTt2YXIgT2M9bmV3IGhjKFgpO1QuYShPYyk7eShhYixBKTthYi5wcm90b3R5cGUuVD1mdW5jdGlvbigpe2cuU2M/KHRoaXMuZj1nLlNjLHRoaXMuYih0aGlzLmYueGEoKSksdGhpcy5nKHRoaXMuZi5SKCkpKToKdGhpcy5hKCl9O2FiLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpfTthYi5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuZi5wbGF5KCl9O2FiLnByb3RvdHlwZS52ZD1mdW5jdGlvbihhLGMpe2lmKCJ0aW1ldXBkYXRlIj09YSl7YT1jLnRhcmdldC5oZWlnaHQ7dmFyIGQ9Yy50YXJnZXQuY3VycmVudFRpbWUsZT1jLnRhcmdldC5kdXJhdGlvbixmPU1hdGguZmxvb3IoZCksaD17fTtoLndpZHRoPWMudGFyZ2V0LndpZHRoO2guaGVpZ2h0PWE7aC5jdXJyZW50VGltZT1kO2guZHVyYXRpb249ZTtoLnJlbWFpbmluZ1RpbWU9ZS1kO2guZXZlbnQ9IkFkUmVtYWluaW5nVGltZUNoYW5nZSI7ZiE9dGhpcy5sJiYoMD09ZiYmKGguZXZlbnQ9ImltcHJlc3Npb24iKSxmPT1NYXRoLmZsb29yKGUvNCkmJihoLmV2ZW50PSJmaXJzdHF1YXJ0aWxlIiksZj09TWF0aC5mbG9vcihlLzIpJiYoaC5ldmVudD0ibWlkcG9pbnQiKSxmPT1NYXRoLmZsb29yKDMqZS80KSYmCihoLmV2ZW50PSJ0aGlyZHF1YXJ0aWxlIiksdGhpcy5tKGgpLHRoaXMubD1mKX1lbHNlImVuZGVkIj09YSYmdGhpcy5tKHtldmVudDoiZW5kZWQifSl9O2FiLnByb3RvdHlwZS5tPWZ1bmN0aW9uKGEpe2EudmVydGljYWxpemVyPSEwO3RoaXMuYWImJnRoaXMuYWIucG9zdE1lc3NhZ2UoYSwiKiIpfTthYi5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iVmVydGljYWxpenJQbGF5ZXIifTt5KGdjLEUpO2djLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnZlcnRpY2FsaXplciYmKHRoaXMuYWI9YS5zb3VyY2UsdGhpcy5wbGF5ZXIuYWI9YS5zb3VyY2UsdGhpcy5hKCkpfS5iaW5kKHRoaXMpKX07eShmYyxGKTtmYy5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPW5ldyBhYih7fSk7dGhpcy5iKGEpfHxhLml8fCh0aGlzLmkoYSksKG5ldyBnYyhhLHRoaXMuYSkpLncoKSk7CnRoaXMuZygpfTt2YXIgUGM9bmV3IGZjKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLnBhdXNlKCk7bC5hKHYuYix0aGlzLnBsYXllci5DYSgpKTt2YXIgYz1nLnYuYTthPW5ldyBpYShhLGMpO2EuZXhpdEZ1bGxzY3JlZW4oKTtnLkguSmE9ITA7YT1uZXcgdShhLGcuSCxjKTthLk5iKGMpO2EuZWEoInZlcnRpY2FsaXpyIik7dGhpcy5wbGF5ZXIuamQoYSl9KTtULmEoUGMsITApO3kodWEsQSk7dWEucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGM9YS5wbGF5ZXJDb250YWluZXI7aWYoIWMmJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihjPWEucGFyZW50Tm9kZSksIWMpKXt0aGlzLmEoKTtyZXR1cm59dGhpcy5iKGMpO2E9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSwKdGhpcy5sPSEwKTthP3RoaXMuZyhhKTp0aGlzLmEoKX07dWEucHJvdG90eXBlLnhlPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZmMsZD10aGlzLnlhKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZjJiZjLlZiJiYoMDw9ZC5pbmRleE9mKGUpfHxjLmpjKCkpfTt1YS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oYSl7YXx8KHRoaXMuZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9O3VhLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3RoaXMuZisrO2lmKDEwPHRoaXMuZilyZXR1cm4hMTsKdGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH07dWEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfTt1YS5wcm90b3R5cGUuaXNQbGF5aW5nPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9O3VhLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lP2EucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lP3dpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCk6MH07dWEucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbj9hLnBsYXllckluc3RhbmNlLmR1cmF0aW9uOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbj93aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpOjB9O3VhLnByb3RvdHlwZS5jYT1mdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn07dWEucHJvdG90eXBlLk1hPWZ1bmN0aW9uKCl7fTt5KGViLEUpO2ViLnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7aWYoIXRoaXMudSlpZih0aGlzLmN8fAoodGhpcy5jPTApLHRoaXMucGxheWVyLmlzUGxheWluZygpJiZ0aGlzLmMrKywxNTx0aGlzLmMpdGhpcy5KKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZighMCk7ZWxzZXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudT0hMDt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGQpe3RoaXMuRyhkKTt0aGlzLnN8fCh0aGlzLkooImFkZXJyb3IiLHRoaXMuWCksdGhpcy5mKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX07ZWIucHJvdG90eXBlLkI9ZnVuY3Rpb24oKXt0aGlzLnM9ITA7dGhpcy5NKCJlbXB0eSB2YXN0Iil9O2ViLnByb3RvdHlwZS5HPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoZixoKXt2YXIgbT0hMTtpZihmKXtpZigxMDA5PT1mfHwzMDM9PWZ8fDQwMz09ZiltPSEwO218fCFmLmluZGV4T2Z8fC0xPT09Zi5pbmRleE9mKCIxMDA5IikmJi0xPT09Zi5pbmRleE9mKCIzMDMiKSYmLTE9PT1mLmluZGV4T2YoIjQwMyIpfHwobT0hMCk7Im51bWJlciI9PXR5cGVvZiBmJiYoaC5YPWYsaC5KKCJhZGVycm9yIixmKSl9cmV0dXJuIG19YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmMoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5CKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZjKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5CKCk7YnJlYWt9fTtlYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3RoaXMuWD10aGlzLlh8fCExO3RoaXMubygpO3ZhciBjPXdpbmRvdy5vdlZpZGVvO2N8fChjPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2MmJmMucmVnaXN0ZXJFdmVudCYmIXRoaXMuRD8oYy5yZWdpc3RlckV2ZW50KGMuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKSxjLnJlZ2lzdGVyRXZlbnQoYy5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpLApjLnJlZ2lzdGVyRXZlbnQoYy5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpLGMucmVnaXN0ZXJFdmVudChjLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5KKCJhZGVycm9yIix0aGlzLlgpO3RoaXMuZigpfS5iaW5kKHRoaXMpKSx0aGlzLkQ9ITAsYy5yZWdpc3RlckV2ZW50KGMuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oZCl7YS54ZShkKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcyksMTAwKX07ZWIucHJvdG90eXBlLmY9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLmFjdGl2ZVBsYXllciYmCih0aGlzLnBsYXllcj1uZXcgdWEod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5hKGEpfTt5KGVjLEYpO2VjLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYKKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9bmV3IHVhKGFbY10pO2QuaXx8dGhpcy5iKGQpfHwodGhpcy5pKGQpLChuZXcgZWIoZCx0aGlzLmEpKS53KCkpfXRoaXMuZygpfTt2YXIgUWM9bmV3IGVjKFgpO1QuYShRYyk7eSh6YSxBKTt6YS5wcm90b3R5cGUuVD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Y3x8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLmIoYyk7dGhpcy5vKGEpO3RoaXMuZigpfTt6YS5wcm90b3R5cGUubz1mdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX07emEucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnhhKCksYz10aGlzLlIoKTsKY3x8KChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYz90aGlzLmcoYyk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApKX07emEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfTt6YS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfTt6YS5wcm90b3R5cGUuSGE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX07emEucHJvdG90eXBlLiRjPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wYXJhbWV0ZXJzJiYhMT09PWEucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH07CnphLnByb3RvdHlwZS5jYT1mdW5jdGlvbigpe3JldHVybiJPb3lhbGEifTt6YS5wcm90b3R5cGUuRWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlIoKTtyZXR1cm4gYT9hLm11dGVkOiEwfTt6YS5wcm90b3R5cGUuQ2E9ZnVuY3Rpb24oKXt2YXIgYT17fSxjPXRoaXMuUigpLGQ9dGhpcy54YSgpO2lmKGEudmlkZW9UYWc9YylhLnZpZGVvVGFnSWQ9Yy5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfTt5KE1hLEUpO01hLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGMoKTt0aGlzLmM9dGhpcy5jfHwhMTt2YXIgYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTtjLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGQsZSl7dGhpcy5PKGUpfS5iaW5kKHRoaXMpKTtjLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMucz0KITA7dGhpcy5LJiZ0aGlzLk4oKX0uYmluZCh0aGlzKSk7Yy5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5wbGF5ZXIuZmM7ZCYmZC5WYiYmdGhpcy5wbGF5ZXIucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtjLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5mKCk7dGhpcy5LPSEwO3RoaXMuTigpfS5iaW5kKHRoaXMpKTt0aGlzLkcoKX07TWEucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLmN8fChoYigiaW1hOiAiK3RoaXMuZigpLCJPb3lhbGEiKSx0aGlzLnN8fHRoaXMuZigpP3RoaXMucyYmdGhpcy5EJiYhdGhpcy51JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwKMTAwKSl9O01hLnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JKCk7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19O01hLnByb3RvdHlwZS5JPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoImFkTWFuYWdlckNvbnRyb2xsZXIiPT09ZC5uYW1lKXJldHVybiBkLmluc3RhbmNlfX07TWEucHJvdG90eXBlLkc9ZnVuY3Rpb24oKXtpZih0aGlzLmYoKSl7dmFyIGE9dGhpcy5JKCkuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMudT0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkQ9YS5uZn10aGlzLmkoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSwxMDApfTtNYS5wcm90b3R5cGUuUD1mdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJgoiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX07TWEucHJvdG90eXBlLk89ZnVuY3Rpb24oYSl7dGhpcy5jPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdLDEwKTowOzEwMDk9PXRoaXMuY3x8MzAyPT10aGlzLmM/dGhpcy5CPSEwOnRoaXMuSigiYWRlcnJvciIsdGhpcy5jKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9O01hLnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7dGhpcy5CPyh0aGlzLk0oKSx0aGlzLmIoKSk6YS4kYygpPyh0aGlzLmEoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuUChhKT8odGhpcy5hKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMDApfTt5KGRjLEYpO2RjLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5sPTE1MDA7dmFyIGE9dGMoKTtpZihhJiZhLl9faW50ZXJuYWwmJmEuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGwuemEoYS5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYyBpbiBhLl9faW50ZXJuYWwucGxheWVycylpZihhLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9bmV3IHphKGEuX19pbnRlcm5hbC5wbGF5ZXJzW2NdKTt0aGlzLmIoZCl8fCh0aGlzLmkoZCksKG5ldyBNYShkLHRoaXMuYSkpLncoKSl9dGhpcy5nKCl9O3ZhciBSYz1uZXcgZGMoWCk7VC5hKFJjKTt5KEhhLEEpO0hhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dGhpcy5pPSExO3RoaXMuZigpfTtIYS5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3ZhciBhPSExLGM9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7CmF8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnR8fHRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50RWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYz10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWMmJihjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmM/KHRoaXMuYihhKSx0aGlzLmcoYykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX07SGEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX07SGEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9O0hhLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfTsKSGEucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9O0hhLnByb3RvdHlwZS5NYT1mdW5jdGlvbigpe3RoaXMubCgpfTtIYS5wcm90b3R5cGUubD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuYyYmKDAsdGhpcy5jKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCl9LmJpbmQodGhpcyksMTAwKX07SGEucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn07eSh6YixFKTt6Yi5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYz1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYz1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1jJiYoOTAwPT1jJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLk0oImVtcHR5IiksdGhpcy5iKCkpOgoxMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz90aGlzLmIoKTp0aGlzLmYoKSl9O3piLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYz0wO2M8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtjKyspdGhpcy5jKGEuYWRFcnJvckV2ZW50c1tjXSk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGQpe3RoaXMuYyhkKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oInBsYXlpbmciLGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7aWYoZC5hZEVycm9yRXZlbnRzKWZvcih2YXIgZT0wO2U8ZC5hZEVycm9yRXZlbnRzLmxlbmd0aDtlKyspdGhpcy5jKGQuYWRFcnJvckV2ZW50c1tlXSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuTSgiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX07emIucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuYSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTApfTt5KEtiLEYpO0tiLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2E9bmV3IEhhKGEpO2EuaT90aGlzLmcoKTp0aGlzLmIoYSl8fChhLm8oTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuaShhKSwobmV3IHpiKGEsdGhpcy5hKSkudygpKX07S2IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLm18fCh0aGlzLm09ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihjKXt0aGlzLmMoYy5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuKXtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLmMod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKX1lbHNlIGlmKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImJpdG1vdmlucGxheWVyLWNvbnRhaW5lciIpKWZvcihhPQowO2E8ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYml0bW92aW5wbGF5ZXItY29udGFpbmVyIikubGVuZ3RoO2ErKyl0aGlzLmMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYml0bW92aW5wbGF5ZXItY29udGFpbmVyIilbYV0pO3RoaXMuZygpfTt2YXIgU2M9bmV3IEtiKFgpO1QuYShTYyk7eShkYixBKTtkYi5wcm90b3R5cGUuVD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYz1hLmNvbnRhaW5lcjthLmdldENvbmZpZz1mdW5jdGlvbigpe3JldHVybnthZHZlcnRpc2luZzp7cHJlcm9sbEFkVGFnOiJ2ZXJ0aWNhbGl6ciJ9fX07aWYoYyl7dHJ5e2MuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y2F0Y2goZCl7fXRoaXMuYihjKTt0aGlzLmcoYyl9ZWxzZSB0aGlzLmEoKX07ZGIucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7d2luZG93LmI9ZztpZighdGhpcy5pc1BhdXNlZCl7dGhpcy5pc1BhdXNlZD0hMDtmb3IodmFyIGE9dGhpcy5wbGF5ZXIuY29udGFpbmVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKSwKYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uc3R5bGUuZmlsdGVyPSJibHVyKDhweCkiO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Euc3R5bGUud2lkdGg9IjEwMCUiO2Euc3R5bGUuaGVpZ2h0PSIxMDAlIjthLnN0eWxlLnRvcD0iMCI7YS5zdHlsZS5sZWZ0PSIwIjthLnN0eWxlLmZvbnRGYW1pbHk9IlNwaWVnZWxTZXJpZlVJLEFyaWFsLHNhbnMtc2VyaWYiO2Euc3R5bGUuZm9udFNpemU9IjIwcHgiO2EuaW5uZXJIVE1MPSI8Yj5MaXZlVGlja2VyPC9iPiI7dGhpcy5sPWE7dGhpcy5wbGF5ZXIuY29udGFpbmVyLmFwcGVuZENoaWxkKGEpO3RoaXMucGxheWVyLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJlZCI7Yy5zdHlsZS5mb250RmFtaWx5PSJTcGllZ2VsU2VyaWZVSSxBcmlhbCxzYW5zLXNlcmlmIjsKYy5zdHlsZS5jb2xvcj0id2hpdGUiO2Muc3R5bGUuZm9udFNpemU9IjE1cHgiO2Muc3R5bGUucGFkZGluZ0xlZnQ9IjE1cHgiO2Muc3R5bGUubWFyZ2luVG9wPSIyMHB4IjtjLmlubmVySFRNTD0iTnVyIGVpbiBWaWRlbyB6dW0gTGFkZW4gZGVzIFRpY2tlcnMgPiI7Yy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Mub25jbGljaz1mdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyk7Yz0uNTYyNSp0aGlzLnBsYXllci5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Quc3R5bGUud2lkdGg9IjEwMCUiO2Quc3R5bGUuaGVpZ2h0PSIiK2MrInB4IjtkLnN0eWxlLm1heEhlaWdodD0iNTAwcHgiO2Quc3R5bGUudG9wPSIwIjtkLnN0eWxlLmxlZnQ9IjAiO2Qub25jbGljaz1mdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpOwphLmFwcGVuZENoaWxkKGQpO3RoaXMuYihkKX19O2RiLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7aWYodGhpcy5pc1BhdXNlZCl7dGhpcy5pc1BhdXNlZD0hMTt0aGlzLmwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmwpO2Zvcih2YXIgYT10aGlzLnBsYXllci5jb250YWluZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpLGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdLnN0eWxlLmZpbHRlcj0iIn19O2RiLnByb3RvdHlwZS5DZT1mdW5jdGlvbihhKXt0aGlzLmY9YX07ZGIucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuImNsb2FrZXIifTt5KGNjLEUpO2NjLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYz1hLmdldFJhd1BsYXllcigpLmNvbmYuYWRCcmVha1RpbWU7YS5DZShmdW5jdGlvbigpe2cudi5pLnZlcnRpY2FsaXpyPSExO3RoaXMuYSgpfS5iaW5kKHRoaXMpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2EucGF1c2UoKX0sCmMpfTt5KGJjLEYpO2JjLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9Zy5qLmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoYSYmYS5xdWVyeUtleSYmYS5xdWVyeUtleS5hZGJyZWFrZXIpe2cuVWQ9ITA7dmFyIGM9Zy52LmIoImNsb2FrZXIiKXx8VGM7YS5xdWVyeUtleS5hZEJyZWFrVGltZSYmKGMuYWRCcmVha1RpbWU9YS5xdWVyeUtleS5hZEJyZWFrVGltZSk7YS5xdWVyeUtleS5taW5IZWlnaHQmJihjLm1pbkhlaWdodD1hLnF1ZXJ5S2V5Lm1pbkhlaWdodCk7YS5xdWVyeUtleS5xdWVyeVNlbGVjdG9yQWxsJiYoYy5xdWVyeVNlbGVjdG9yQWxsPWEucXVlcnlLZXkucXVlcnlTZWxlY3RvckFsbCk7aWYoYyl7YT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGMucXVlcnlTZWxlY3RvckFsbCk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspe3ZhciBlPWFbZF07IkRJViI9PWUubm9kZU5hbWUmJihlPW5ldyBkYih7Y29udGFpbmVyOmUsY29uZjpjfSksZS5pfHx0aGlzLmIoZSl8fAoodGhpcy5pKGUpLChuZXcgY2MoZSx0aGlzLmEpKS53KCkpKX10aGlzLmcoKX19fTt2YXIgVGM9e3F1ZXJ5U2VsZWN0b3JBbGw6Ii5vdXRicmFpbi1jb250YWluZXIiLGFkQnJlYWtUaW1lOiI1MDAifSxVYz1uZXcgYmMoWCk7VC5hKFVjKTt5KCRhLEEpOyRhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS50b1N0cmluZygpKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnRvU3RyaW5nKCkpO3RoaXMuYihhKTtpZihhKXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLmcoYyl9ZWxzZSB0aGlzLmEoKX1lbHNlIHRoaXMuYSgpfTskYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319OwokYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGEpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX07JGEucHJvdG90eXBlLldiPWZ1bmN0aW9uKCl7dmFyIGE9Zy52LmE7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfTskYS5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifTt5KHliLEUpO3liLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7dGEuQSgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3RhLkEoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYyl7dGhpcy5jKGMpfS5iaW5kKHRoaXMpKTt0YS5BKCIjIithLCJhZHNMb2FkZXJGYWlsZWQiLApmdW5jdGlvbigpe3RoaXMuSigiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuYSgpfS5iaW5kKHRoaXMpKTt0YS5BKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMuSigiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLmEoKX0uYmluZCh0aGlzKSk7dGEuRCgpfTt5Yi5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYz0iIixkO2ZvcihkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSl7Yz1pc05hTihhW2RdKT8hMTphW2RdO2lmKDEwMDk9PWFbZF18fDEwMDE9PWFbZF18fDMwMz09YVtkXXx8NDAzPT1hW2RdKXt0aGlzLk0oKTt0aGlzLmIoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGM9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMuTSgpO3RoaXMuYigpO3JldHVybn19dGhpcy5KKCJhZGVycm9yIiwKYyk7dGhpcy5hKCl9O3koY2IsRik7Y2IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYT1bXSxjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGQ9MDtkPGMubGVuZ3RoO2QrKylhLnB1c2goY1tkXSk7Yz1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGQ9MDtkPGMubGVuZ3RoO2QrKylhLnB1c2goY1tkXSk7dGhpcy5vJiYoYT1sLkRiKGEsdGhpcy5vKSk7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGU9YVtjXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpO2U9bmV3ICRhKGUpO2lmKCF0aGlzLmIoZSkmJiFlLmkpe3RoaXMuaShlKTt2YXIgZj1uZXcgeWIoZSx0aGlzLmEpO2YudygpfX1mb3IoYz0wO2M8YS5sZW5ndGg7YysrKWZvcihkPWFbY107ZC5wYXJlbnRFbGVtZW50Oyl7ZD1kLnBhcmVudEVsZW1lbnQ7dmFyIGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiKwpoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5vfHwodGhpcy5vPVtdKSx0aGlzLm8ucHVzaChhW2NdKSxlPW5ldyAkYShoKSx0aGlzLmIoZSl8fGUuaXx8KHRoaXMuaShlKSxmPW5ldyB5YihlLHRoaXMuYSksZi53KCkpfWNhdGNoKG0pe319fXRoaXMuZygpfTtjYi5wcm90b3R5cGUuQT1mdW5jdGlvbihhLGMsZCl7dGhpcy5jfHwodGhpcy5jPXt9KTt0aGlzLmNbYV18fCh0aGlzLmNbYV09e30pO3RoaXMuY1thXVtjXXx8KHRoaXMuY1thXVtjXT1bXSk7dGhpcy5jW2FdW2NdLnB1c2goZCl9O2NiLnByb3RvdHlwZS5LPWZ1bmN0aW9uKGEpe3ZhciBjPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY3x8dGhpcy5jJiYhdGhpcy5jW2NdKXRoaXMubXx8KHRoaXMubT1bXSksdGhpcy5tLnB1c2goYSksdGhpcy5OKCkmJih0aGlzLnUoKSx0aGlzLncoKSk7ZWxzZXt2YXIgZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jW2NdW2RdJiYKMDx0aGlzLmNbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5jW2NdW2RdW2VdKGEpfX07Y2IucHJvdG90eXBlLkQ9ZnVuY3Rpb24oKXtpZih0aGlzLm0pZm9yKHZhciBhPTA7YTx0aGlzLm0ubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5tW2FdLGQ9Yy5zUGxheWVyU2VsZWN0b3IsZT0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBjLm9FdmVudFR5cGUmJihlPWMub0V2ZW50VHlwZSk7aWYodGhpcy5jW2RdW2VdJiYwPHRoaXMuY1tkXVtlXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNbZF1bZV0ubGVuZ3RoO2YrKyl0aGlzLmNbZF1bZV1bZl0oYyl9fTtjYi5wcm90b3R5cGUuQj1mdW5jdGlvbihhLGMpe2Zvcih2YXIgZD0xO2Q8YXJndW1lbnRzLmxlbmd0aDsrK2QpOyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1hLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9YS5vRXZlbnRUeXBlLmgmJnRhLksoYSl9Owp2YXIgdGE9bmV3IGNiKFgpO1QuYSh0YSk7cmMoKTt5KFphLEEpO1phLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS50b1N0cmluZygpKTt0aGlzLmIoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5nKGMpfTtaYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9O1phLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9O1phLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLmlzUGxheWluZygpJiYKYS5wYXVzZSgpfSl9O1phLnByb3RvdHlwZS5FYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfTtaYS5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn07eShhYyxFKTthYy5wcm90b3R5cGUudz1mdW5jdGlvbigpe2wuZygzKTt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTskKCIjIithKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYyl7bC5PLnB1c2goeyJbd2lkdGhdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0V2lkdGh9KTtsLk8ucHVzaCh7IltoZWlnaHRdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0SGVpZ2h0fSk7dGhpcy5wbGF5ZXIubXV0ZWQ9Yy5kYXRhLm11dGVkO2Mub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yy5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFjLmlzUGxheWluZ3x8Yy5pc1BsYXlpbmcoKSljLmlzQWQmJgpjLmlzQWQoKT90aGlzLk0oKTpjLmRhdGEmJmMuZGF0YS5hZHMmJmMuZGF0YS5hZHMudmFzdCYmYy5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLkooIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLmEoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkooIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLmEoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Mub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yy5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Mub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5hKCl9LmJpbmQodGhpcykpO2Mub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5hKCl9LmJpbmQodGhpcykpO2Mub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yy5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMuTSgpfS5iaW5kKHRoaXMpKTtjLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5NKCl9LmJpbmQodGhpcykpOwpjLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5NKCl9LmJpbmQodGhpcykpO2Mub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuTSgpfS5iaW5kKHRoaXMpKTtjLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5NKCl9LmJpbmQodGhpcykpO2Mub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuTSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9O3koSmIsRik7SmIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe3ZhciBkPWFbY10sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChoKXtlPWQuaWR9aWYoZSYmCiQoIiMiK2UpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBmPW5ldyBaYShlKTt0aGlzLmIoZil8fCh0aGlzLmkoZiksKG5ldyBhYyhmLHRoaXMuYSkpLncoKSl9Y2F0Y2goaCl7fX10aGlzLmcoKX07SmIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dmFyIGM9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitjKTtmb3IodmFyIGQgaW4gdGhpcy5mKWlmKGM9PXRoaXMuZltkXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5mW2EueWEoKV0/ITA6ITF9O3ZhciBWYz1uZXcgSmIoWCk7VC5hKFZjKTt5KHFhLEEpO3FhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9ITEsYz0hMTt0aGlzLmFiPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihkKXt0cnl7aWYoZCYmZC5zb3VyY2UmJmQuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnN8fChkLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLlJjKCl9LmJpbmQodGhpcykpLAp0aGlzLnM9ITApO3ZhciBlPXRoaXMudShkLnNvdXJjZS5fZW52dmFycyk7ZSYmKHRoaXMubT1lKTtpZighdGhpcy5BJiYoZC5zb3VyY2UuQ0hPT1NFUl9USU1FfHxkLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGY9ZC5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsaD1kLnNvdXJjZS5DSE9PU0VSX1RJTUV8fCIiO2wudHJhY2soInN0YXRzX2Nob29zZXJfYWIiLGYsITApO2wudHJhY2soInN0YXRzX2Nob29zZXJfaW50ZXJhY3Rpb24iLGYrKHBhcnNlSW50KGgsMTApPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7bC50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLkE9ITA7dGhpcy5hYj1kLnNvdXJjZX19fWNhdGNoKG0pe319LmJpbmQodGhpcykpO3RoaXMudmMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGM9YSk7dGhpcy5iKGEpO3RoaXMuZyhjKTsKdGhpcy5HKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7aGIoInNldCB1cCBwbGF5ZXIgRE9ORSIsdGhpcy5nZXRSYXdQbGF5ZXIoKSxhLCJPbmx5SE9NQUQiKX07cWEucHJvdG90eXBlLnRkPWZ1bmN0aW9uKGEpe3RoaXMubHx8KHRoaXMubD1bXSk7dGhpcy5sLnB1c2goYSl9O3FhLnByb3RvdHlwZS55ZD1mdW5jdGlvbigpe3RoaXMuYWImJnRoaXMuYWIucG9zdE1lc3NhZ2UoImNsaWNrdGhyb3VnaF9ldmVudCIpfTtxYS5wcm90b3R5cGUuUmM9ZnVuY3Rpb24oKXtpZih0aGlzLmwmJnRoaXMubC5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmwubGVuZ3RoO2ErKyl0cnl7dGhpcy5sW2FdKCl9Y2F0Y2goYyl7fX07cWEucHJvdG90eXBlLmV4aXRGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuITB9O3FhLnByb3RvdHlwZS52Yz1mdW5jdGlvbigpe2lmKHRoaXMubSlyZXR1cm4gdGhpcy5tO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7CmlmKGE9dGhpcy51KGEpKXJldHVybiB0aGlzLm09YX19O3FhLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEpe3ZhciBjPSExO2EmJmEudmlkZW9TbG90JiYoYz1hKTthJiZhLmhkdnBhaWQmJihjPWEuaGR2cGFpZCk7cmV0dXJuIGN9O3FhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe307cWEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt9O3FhLnByb3RvdHlwZS5HPWZ1bmN0aW9uKGEsYyl7YSYmYS5wYXVzZUV2ZW50JiZjLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mJiZ0aGlzLmYucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmYucGF1c2UmJnRoaXMuZi5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZjLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZiYmdGhpcy5mLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZi5yZXN1bWUmJnRoaXMuZi5yZXN1bWUoKX0uYmluZCh0aGlzKSk7CmEmJmEubXV0ZUV2ZW50JiZjLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmYmJnRoaXMuZi5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mLm11dGUmJnRoaXMuZi5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mJiZ0aGlzLmYudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mLnVubXV0ZSYmdGhpcy5mLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX07cWEucHJvdG90eXBlLkJkPWZ1bmN0aW9uKGEpe3RoaXMuZj1hfTtxYS5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn07eShJYixFKTtJYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLGM9dGhpcy5wbGF5ZXI7YS5hdXRvc3RhcnQmJiF0aGlzLm8mJih0aGlzLmYoKSx0aGlzLm89ITAsdGhpcy5nKCkpOwpjLnhhKCkuYWRkRXZlbnRMaXN0ZW5lcihhLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpKX07SWIucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci52YygpP3RoaXMuYSgpOih0aGlzLmN8fCh0aGlzLmM9MSksdGhpcy5jKyssMTA8dGhpcy5jP3RoaXMuYSgpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwKSl9O3koJGIsRik7JGIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXtpZihnLnYuZyl7aWYoZy52LmEucGxheWVyKXt2YXIgYT1nLnYuYS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGUpe2wudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGMsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHFhKGFbZF0pLHRoaXMuYihjKXx8KHRoaXMuaShjKSwobmV3IEliKGMsdGhpcy5hKSkudygpKX19ZWxzZSB0aGlzLmcoKX07dmFyIFdjPW5ldyAkYihYKTtULmEoV2MpOwp5KExhLEEpO0xhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuYihhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nKGEpO3RoaXMuS2E9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuS2E9ITB9LmJpbmQodGhpcykpfTtMYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9O0xhLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9O0xhLnByb3RvdHlwZS5FYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO3JldHVybiBhP2EubXV0ZWQ6ITB9O0xhLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfTtMYS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn07CkxhLnByb3RvdHlwZS5NYT1mdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuYz8oMCx0aGlzLmMpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcyksNDAwKX07TGEucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifTt5KGtiLEUpO2tiLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YT1hLmdldFJhd1BsYXllcigpO3JldHVybiBhLmltYUFkc0xvYWRlcn07a2IucHJvdG90eXBlLkI9ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYyl7Yz1jLmdldEVycm9yKCk7Yy5nZXRFcnJvckNvZGUoKTt0aGlzLmN8fCh0aGlzLmM9W10pO3RoaXMuYy5wdXNoKGMuZ2V0RXJyb3JDb2RlKCkpOwoxMDA5PT1jLmdldEVycm9yQ29kZSgpfHwzMDM9PWMuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yy5nZXRFcnJvckNvZGUoKT90aGlzLmIoKTp0aGlzLkooImFkZXJyb3IiLGMuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5vPSEwO3RoaXMuTSgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfTtrYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMucygpO3RoaXMuZj90aGlzLkIodGhpcy5mKToodGhpcy5mPXRoaXMudSgpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDEwMCkpfTtrYi5wcm90b3R5cGUucz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKGEuS2EmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5mKXt0aGlzLmEoKTtyZXR1cm59aWYoIXRoaXMubyl7dGhpcy5hKCk7cmV0dXJufWE9CiEwO2lmKHRoaXMuYyYmdGhpcy5jLmxlbmd0aCYmMTx0aGlzLmMubGVuZ3RoKWZvcih2YXIgYz0wO2M8dGhpcy5jLmxlbmd0aC0xO2MrKykxMDA5IT10aGlzLmNbY10mJjMwMyE9dGhpcy5jW2NdJiY0MDMhPXRoaXMuY1tjXSYmKGE9ITEpO2lmKGEpdGhpcy5NKCJlbXB0eSIpLHRoaXMuYigpO2Vsc2V7dGhpcy5hKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9O3koWmIsRik7WmIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLmw9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYyBpbiBhKXt2YXIgZD1uZXcgTGEoYS5pdGVtKCtjKSk7dGhpcy5iKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5pKGQpLChuZXcga2IoZCx0aGlzLmEpKS53KCkpfXRoaXMuZygpfTt2YXIgWGM9Cm5ldyBaYihYKTtULmEoWGMpO3koeWEsQSk7eWEucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuYihhKTt0aGlzLmcoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl9O3lhLnByb3RvdHlwZS5NYT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5sKCl9LmJpbmQodGhpcyksNTAwKX07eWEucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYz10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZjJiYwPGMmJmE+PWMtMSYmdGhpcy5jJiZ0aGlzLmMoKX07eWEucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxjPTA7YS5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGM9YS5wbGF5YmFjay5nZXREdXJhdGlvbigpKTsKcmV0dXJuIGN9O3lhLnByb3RvdHlwZS5nZXRQb3NpdGlvbj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYz0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihjPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGN9O3lhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX07eWEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuZik7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9O3lhLnByb3RvdHlwZS5pc1BsYXlpbmc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfTt5YS5wcm90b3R5cGUuSWU9ZnVuY3Rpb24oKXt0aGlzLmY9CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9O3lhLnByb3RvdHlwZS5jYT1mdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In07eShIYixFKTtIYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMubz0xMDt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTt0aGlzLmZ8fCh0aGlzLmY9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5KKCJhZGVycm9yIik7dGhpcy5jKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLkooIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuYygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMuSigibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksCnRoaXMuYygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLkooIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuYygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5KKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMuSigibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5jKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMuSigibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5jKCkpKToodGhpcy5KKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMuSigibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5jKCkpKToodGhpcy5mfHx0aGlzLmYrKyx0aGlzLmY8PXRoaXMubz8odGhpcy5mKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMuSigibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5jKCkpKX07SGIucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pc1BsYXlpbmcoKT8odGhpcy5wbGF5ZXIuSWUoKSx0aGlzLmEoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfTt5KFliLEYpO1liLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxjO2EmJmFbMF0mJihjPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZjWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgeWEod2luZG93LnBsYXllckFwaSksdGhpcy5iKGEpfHwodGhpcy5pKGEpLChuZXcgSGIoYSx0aGlzLmEpKS53KCkpKTt0aGlzLmcoKX07dmFyIFljPW5ldyBZYihYKTtULmEoWWMpO3koU2EsCkEpO1NhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2EucGFyZW50Tm9kZT8oYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZSk/KHRoaXMuYihhKSwoYT10aGlzLmdldFJhd1BsYXllcigpKT8odGhpcy5nKGEpLHRoaXMuS2E9ITEsYS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuS2E9ITB9LmJpbmQodGhpcykpKTp0aGlzLmY9ITApOnRoaXMuZj0hMDp0aGlzLmY9ITA6dGhpcy5mPSEwfTtTYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9O1NhLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9O1NhLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYz0iIjthLmN1cnJlbnRUaW1lJiYoYz1hLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGN9O1NhLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYz0wO2EuZHVyYXRpb24mJihjPWEuZHVyYXRpb24pO3JldHVybiBjfTtTYS5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYz10aGlzLmdldER1cmF0aW9uKCk7YSYmYyYmMT5jLWE/dGhpcy5jKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcyksMjAwKX07U2EucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9O3koWWEsRSk7WWEucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci54YSgpLGM9dGhpcy5wbGF5ZXIuUigpO2MmJmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMucGxheWVyLkthPSExfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMuTSgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLk0oKX0uYmluZCh0aGlzKSk7YT10aGlzLmYoKTswPGEuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkIoKTp0aGlzLnMoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmEoKXx8KHRoaXMuSigiY29udGVudHBsYXkiKSx0aGlzLmMoITApKX0uYmluZCh0aGlzKSwxRTMpfTtZYS5wcm90b3R5cGUudT1mdW5jdGlvbigpe3RoaXMuYmEoKXx8dGhpcy5jKCEwKX07WWEucHJvdG90eXBlLkI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmYoKTshYS5JYSYmYS5MYSYmYS5sZiYmYS5tZiYmKHRoaXMuSigibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmMoKSl9O1lhLnByb3RvdHlwZS5zPWZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihjKXthOntjPWMuZ2V0RXJyb3IoKTtmb3IoZCBpbiBjKWlmKCJudW1iZXIiPT10eXBlb2YgY1tkXSl7dmFyIGQ9Y1tkXTticmVhayBhfWQ9dm9pZCAwfTEwMDk9PWR8fDMwMz09ZHx8NDAzPT1kPyh0aGlzLk0oKSx0aGlzLmIoKSk6KHRoaXMuSigiYWRlcnJvciIsZCksdGhpcy5jKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9O1lhLnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7aWYoIXRoaXMubylmb3IodmFyIGE9a2MuYygpLGM9dGhpcy5wbGF5ZXIueGEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YyYmKHRoaXMubz1hW2RdKTtyZXR1cm4gdGhpcy5vfTtZYS5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXthPXZvaWQgMD09PQphPyExOmE7dGhpcy5wbGF5ZXIuS2E/YT90aGlzLmYoKS5hZHNMb2FkZXI/dGhpcy5hKCEwKTp0aGlzLmEoKTp0aGlzLmEoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYyhhKX0uYmluZCh0aGlzKSwxMCl9O3koeGIsRik7eGIucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7YT1uZXcgU2EoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuYihhKXx8YS5mfHwodGhpcy5pKGEpLChuZXcgWWEoYSx0aGlzLmEpKS53KCkpfTt4Yi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPWtjLmMoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl0aGlzLm0oYVtjXSk7dGhpcy5nKCl9O3hiLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7dmFyIGE7aWYoZy52LmcmJmcudi5hLnBsYXllcmFwaSYmKGE9Zy52LmEucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTthPVtdO3ZhciBjPQpkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGMmJmMubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZjLmxlbmd0aCl7Zm9yKGQ9MDtkPGMubGVuZ3RoO2QrKyljW2RdJiZjW2RdLmZlcm1vZCYmYS5wdXNoKGNbZF0uZmVybW9kKSxjW2RdJiZjW2RdLnBhcmVudEVsZW1lbnQmJmNbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChjW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxjW2RdJiZjW2RdLnBhcmVudEVsZW1lbnQmJmNbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZjW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChjW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX07dmFyIGtjPW5ldyB4YihYKTtULmEoa2MpO3koS2EsQSk7S2EucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7dGIuYyYmKGE9YS5maXJzdENoaWxkKTtpZihhKXt0aGlzLmIoYSk7aWYoYS50YWdOYW1lKXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1jP3RoaXMuZyhjKTp0aGlzLmEoKX1lbHNlIHRoaXMuYSgpfTtLYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtpZih0Yi5jKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9OwpLYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe2lmKHRiLmMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9O0thLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9O0thLnByb3RvdHlwZS5jYT1mdW5jdGlvbigpe3JldHVybiJuZXh0In07S2EucHJvdG90eXBlLldiPWZ1bmN0aW9uKCl7cmV0dXJuITB9O0thLnByb3RvdHlwZS54YT1mdW5jdGlvbigpe2lmKHRiLmMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkfWVsc2UgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9CnRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfTt5KEdiLEUpO0diLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMuYz1hLmlkKTt0Yi5jP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihjKXt2YXIgZD1jLnBsYXllckNvbnRhaW5lcjtkJiZ0aGlzLmMmJmQhPXRoaXMuY3x8ImFkZXJyb3IiIT1jLmV2ZW50fHxsLmIoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWMuYWRUeXBlfHwoYy5hZFVSTCYmKGNvbmYuYWRUYWc9Yy5hZFVSTCksdGhpcy5KKCJhZGVycm9yIixjLnRmKSx0aGlzLmEoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihjKXsiYWRlcnJvciI9PWMmJgoodGhpcy5KKCJhZGVycm9yIiksdGhpcy5hKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9O3koWGIsRik7WGIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXt0aGlzLmM9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZih0aGlzLmMpZm9yKHZhciBjPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGQ9Yy5sZW5ndGgsZT0wO2U8ZDtlKyspe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY1tlXSkpYT1uZXcgS2EoYSksYS5pfHx0aGlzLmIoYSl8fCh0aGlzLmkoYSksYT1uZXcgR2IoYSx0aGlzLmEpLGEudygpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9Cm5ldyBLYShhKSxhLmk/dGhpcy51KCk6dGhpcy5iKGEpfHwodGhpcy5pKGEpLGE9bmV3IEdiKGEsdGhpcy5hKSxhLncoKSl9dGhpcy5nKCl9O3ZhciB0Yj1uZXcgWGIoWCk7VC5hKHRiKTt5KFJhLEEpO1JhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKWlmKGEuR2V0VmlkZW9FbClpZihhLkdldEVsKXt2YXIgYz1hLkdldFZpZGVvRWwoKTthPWEuR2V0RWwoKTtjJiZhPyh0aGlzLmIoYSksdGhpcy5nKGMpKTp0aGlzLmEoKX1lbHNlIHRoaXMuYSgpO2Vsc2UgdGhpcy5hKCk7ZWxzZSB0aGlzLmEoKX07UmEucHJvdG90eXBlLkVhPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX07UmEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfTtSYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTsKdmFyIGM9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2MuSXNQYXVzZWQoKSYmYy5QbGF5KCk6KGMuUGxheSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5KCEwKX0uYmluZCh0aGlzKSwxMCkpfTtSYS5wcm90b3R5cGUuSGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfTtSYS5wcm90b3R5cGUuV2I9ZnVuY3Rpb24oKXtpZihnLmouTigpJiZnLmouYigidC1vbmxpbmUuZGUiKSlyZXR1cm4hMTt2YXIgYT1nLnYuYTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9O1JhLnByb3RvdHlwZS5jYT1mdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifTt5KFhhLEUpO1hhLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5YPXRoaXMuWHx8ITE7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7Zy5qLmIoInQtb25saW5lLmRlIikmJmcuai5OKCkmJiFnLmouVGEoKSYmCihhLlNldFZBU1RQcmVyb2xsVGFnKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS92ZXJ0aWNhbGl6ci92YXN0NC1lbXB0eS54bWwiKSxnLnYuYS5ydW5JbnNpZGVDb250YWluZXI9ITEpO3RoaXMubygpO2cuai5iKCJ0LW9ubGluZS5kZSIpJiZnLmouTigpJiZnLmouVGEoKSYmKG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGMpe2MuZm9yRWFjaChmdW5jdGlvbihkKXsiYXR0cmlidXRlcyI9PT1kLnR5cGUmJiJzcmMiPT09ZC5hdHRyaWJ1dGVOYW1lJiYoZD1uZXcgZGEodGhpcy5wbGF5ZXIudmlkZW9UYWcuc3JjKSxkLmhvc3QuaW5jbHVkZXMoInZlcnRpY2FsaXpyLmNvbSIpfHwoZC5ob3N0LmluY2x1ZGVzKCJkbGMyLnQtb25saW5lLmRlIik/bnVsbCE9dGhpcy5wYXJlbnQmJnRoaXMudSgpOih0aGlzLnBsYXllci52aWRlb1RhZy5zcmM9Imh0dHBzOi8vd3d3LnZlcnRpY2FsaXpyLmNvbS9hcGkvdmVydGljYWxpemVyLz9tZWRpYWZpbGU9IitnLmouQih0aGlzLnBsYXllci52aWRlb1RhZy5zcmMpKwoiJmM9IitnLmoucygxMCksdGhpcy5wbGF5ZXIudmlkZW9UYWcubG9hZCgpLHRoaXMucGxheWVyLnZpZGVvVGFnLnBsYXkoKSx0aGlzLkIoKSkpKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKS5vYnNlcnZlKHRoaXMucGxheWVyLnZpZGVvVGFnLHthdHRyaWJ1dGVzOiEwLGNoaWxkTGlzdDohMCxjaGFyYWN0ZXJEYXRhOiEwfSk7YS5PbigiYWRFcnJvciIsZnVuY3Rpb24oYyl7dGhpcy5mKGMpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5NKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5NKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk0oKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGMpe2MuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1jLmRldGFpbC5uYW1lJiZ0aGlzLmcoKX0uYmluZCh0aGlzKSl9OwpYYS5wcm90b3R5cGUuQj1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLnhhKCk7dGhpcy5wYXJlbnQ9YS5wYXJlbnRFbGVtZW50O3RoaXMuYz1hLnN0eWxlO2Euc3R5bGUucG9zaXRpb249ImFic29sdXRlIjthLnN0eWxlLnRvcD0iMHB4IjthLnN0eWxlLmxlZnQ9IjBweCI7YS5zdHlsZS53aWR0aD0iMTAwJSI7YS5zdHlsZS5oZWlnaHQ9IjEwMCUiO2Euc3R5bGUuekluZGV4PSIyMDAwMCI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX07WGEucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci54YSgpO2Euc3R5bGU9dGhpcy5jO3RoaXMucGFyZW50LmFwcGVuZENoaWxkKGEpO3RoaXMucGFyZW50PW51bGw7dGhpcy5jPXt9fTtYYS5wcm90b3R5cGUubz1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSxjPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLmYoY1tkXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX07ClhhLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5vKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS52YXN0RXJyb3JDb2RlJiYoYT1hW2NdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpO2EmJmEuaW5kZXhPZiYmMDw9YS5pbmRleE9mKCJBZEVycm9yIDEwMDkgKFRoZSBWQVNUIHJlc3BvbnNlIGRvY3VtZW50IGlzIGVtcHR5IikmJihhPTEwMDkpO2wudT1sLmFhKCkmJigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSk7bC51fHwxMDA5IT1hJiYzMDMhPWEmJjQwMyE9YT8odGhpcy5KKCJhZGVycm9yIixhKSx0aGlzLnMoKSk6KHRoaXMuTSgpLHRoaXMuYigpKX19O1hhLnByb3RvdHlwZS5zPWZ1bmN0aW9uKCl7dGhpcy5hKCExKX07eShXYixGKTtXYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7CmF8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1uZXcgUmEoYVtjXSk7ZC5pfHx0aGlzLmIoZCl8fCh0aGlzLmkoZCksKG5ldyBYYShkLHRoaXMuYSkpLncoKSl9dGhpcy5nKCl9O3ZhciBaYz1uZXcgV2IoWCk7VC5hKFpjKTt5KFdhLEEpO1dhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYz1hLmVsOyhhPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZjPyh0aGlzLmIoYyksdGhpcy5nKGEpKTp0aGlzLmEoKX1lbHNlIHRoaXMuYSgpfTtXYS5wcm90b3R5cGUuRWE9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9O1dhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMucGxheWVyLnBhdXNlKCl9OwpXYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX07V2EucHJvdG90eXBlLkhhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfTtXYS5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iQnJpZFBsYXllciJ9O3kod2IsRSk7d2IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLlg9dGhpcy5YfHwhMTt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5mLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMuTS5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy5NLmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMuTS5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLk0uYmluZCh0aGlzKSl9O3diLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe2lmKG51bGwhPWEpe2lmKCJvYmplY3QiPT0KdHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS52YXN0RXJyb3JDb2RlJiYoYT1hW2NdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLk0oKSx0aGlzLmIoKSk6KHRoaXMuSigiYWRlcnJvciIsYSksdGhpcy5jKCkpfX07d2IucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXt0aGlzLmEoITEpfTt5KFZiLEYpO1ZiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGM7Zm9yKGMgaW4gYSl7dmFyIGQ9bmV3IFdhKGFbY10pO2QuaXx8dGhpcy5iKGQpfHwodGhpcy5pKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyB3YihkLHRoaXMuYSkpLncoKSl9fXRoaXMuZygpfTsKdmFyICRjPW5ldyBWYihYKTtULmEoJGMpO3koc2EsQSk7c2EucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuYSgpO2Vsc2V7Zm9yKHZhciBjPWE7YyYmYy5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1jLnBhcmVudE5vZGUubm9kZU5hbWUpe2M9Yy5wYXJlbnROb2RlO2JyZWFrfWM9Yy5wYXJlbnROb2RlfXRoaXMuZyhhKTt0aGlzLmIoYyl9ZWxzZSB0aGlzLmEoKX07c2EucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQpdmFyIGM9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pO2Vsc2UgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxjLmluaXRDdXN0b21FdmVudChhLCExLCExLHt9KTtjJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjKX07CnNhLnByb3RvdHlwZS5tPWZ1bmN0aW9uKCl7dGhpcy5mPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkU3RhcnQiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmZ8fCh0aGlzLmY9ITAsdGhpcy5sKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSl9O3NhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RyeXt0aGlzLmwoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy5SKCkucGF1c2UoKX19O3NhLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dHJ5e3RoaXMuZiYmKHRoaXMubCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLmY9ITEpLHRoaXMubCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy5SKCkucGxheSgpfX07c2EucHJvdG90eXBlLkhhPWZ1bmN0aW9uKCl7aWYoIXRoaXMuUigpLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLAohMH07c2EucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifTt5KHJhLEUpO3JhLnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5NKCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5NKCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuTSgpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuTSgpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYyl7dGhpcy5jKGMpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGMpe3RoaXMuYyhjKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiYKYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYyl7dGhpcy5jKGMpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5ELmJpbmQodGhpcyksMTApfTtyYS5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYz17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGM9YS5nZXRFcnJvcigpKTtjLmdldEVycm9yQ29kZT8oYy5nZXRFcnJvckNvZGUoKSx0aGlzLkooImFkZXJyb3IiLGMuZ2V0RXJyb3JDb2RlKCkpLHRoaXMucz0hMCwxMDA5PT1jLmdldEVycm9yQ29kZSgpfHwzMDM9PWMuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yy5nZXRFcnJvckNvZGUoKT8odGhpcy5OPSEwLHRoaXMuTSgpKTp0aGlzLmYoKSk6KHRoaXMuc3x8dGhpcy5KKCJub2ZyYW1ld29yayIpLHRoaXMuZigpKX07cmEucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTsKdGhpcy5pKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudS5iaW5kKHRoaXMpLDEwMCl9O3JhLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5EKCk7dGhpcy51KCk7dGhpcy5HKCl9O3JhLnByb3RvdHlwZS5HPWZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLm8uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihhKXt0aGlzLmMoYSl9LmJpbmQodGhpcykpfTtyYS5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTt0aGlzLkI/dGhpcy5hKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKGEpfS5iaW5kKHRoaXMpLDEwMCl9O3JhLnByb3RvdHlwZS5vPWZ1bmN0aW9uKGEpe3RoaXMuQj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGMgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09CmMmJihhLmRldGFpbFtjXXx8dGhpcy5jKGEpKX07eShHYSxGKTtHYS5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IHNhKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5pfHx0aGlzLmIoYSl8fCh0aGlzLmkoYSksYS5tKCksYT1uZXcgcmEoYSx0aGlzLmEpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5vLmJpbmQoYSkpLGEudygpKX10aGlzLmcoKX07dmFyIGFkPW5ldyBHYShYKTtULmEoYWQpO3koVSxBKTtVLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBjPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihjKXt0aGlzLmIoYyk7dmFyIGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmQ/KHRoaXMuZyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGUsZil7dGhpcy5sPWU7dGhpcy51PWZ9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oZSl7dGhpcy5kdXJhdGlvbj1lfS5iaW5kKHRoaXMpKSk6dGhpcy5hKCl9ZWxzZSB0aGlzLmEoKX1lbHNlIHRoaXMuYSgpfTtVLnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEpe3RoaXMubT1hfTtVLnByb3RvdHlwZS5FYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGE9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH07VS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX07VS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9OwpVLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfTtVLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmx9O1UucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259O1UucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9O1UucHJvdG90eXBlLk1hPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLnMoYSl9LmJpbmQodGhpcykpfTtVLnByb3RvdHlwZS5zPWZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGM9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYyYmMDxjJiYKYT49Yy0xJiYhdGhpcy5mJiYodGhpcy5mPSEwLHRoaXMuYyYmdGhpcy5jKCkpfTt5KGJhLEUpO2JhLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMucylpZih0aGlzLmZ8fCh0aGlzLmY9MCksdGhpcy5mKyssMTU8dGhpcy5mKXdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhP3dpbmRvdy5jYW5SdW5BZHM/dGhpcy56YSgpOnRoaXMuYyghMCk6KHRoaXMuSigibm9mcmFtZXdvcmsiLCJJTUEiKSxhLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuYygpOnRoaXMuYyghMCkpO2Vsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5zPSEwO3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGQpe3RoaXMuRChkKTt0aGlzLm98fCh0aGlzLkooImFkZXJyb3IiLHRoaXMuWCksdGhpcy5jKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfTtiYS5wcm90b3R5cGUuQj1mdW5jdGlvbigpe3RoaXMubz0hMDt0aGlzLk0oImVtcHR5IHZhc3QiKX07YmEucHJvdG90eXBlLkQ9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhmLGgpe3ZhciBtPSExO2lmKGYpe2lmKDEwMDk9PWZ8fDMwMz09Znx8NDAzPT1mKW09ITA7bXx8IWYuaW5kZXhPZnx8LTE9PT1mLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1mLmluZGV4T2YoIjMwMyIpJiYtMT09PWYuaW5kZXhPZigiNDAzIil8fChtPSEwKTsibnVtYmVyIj09dHlwZW9mIGY/KGguWD0KZixoLkooImFkZXJyb3IiLGYpKTpoLkooImFkZXJyb3IiKX1yZXR1cm4gbX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZjKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQigpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYyhhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQigpO2JyZWFrfX07YmEucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLlg9dGhpcy5YfHwhMTt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51KCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYyl7InBsYXlpbmciPT1jJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9OwpiYS5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTt0aGlzLmlzUGxheWluZz90aGlzLmEoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoYSl9LmJpbmQodGhpcyksMTApfTt5KEksRik7SS5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IFUod2luZG93Lmluc2VydGVkUGxheWVyKTthLml8fHRoaXMuYihhKXx8KHRoaXMuaShhKSxhPW5ldyBiYShhLHRoaXMuYSksYS53KCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBjPTA7Yzx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YysrKWE9bmV3IFUod2luZG93LlRWMlBsYXllcnNbY10pLGEuaXx8dGhpcy5iKGEpfHwodGhpcy5pKGEpLGE9bmV3IGJhKGEsdGhpcy5hKSxhLncoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYyBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShjKSYmCndpbmRvdy5UVjJQbGF5ZXJzW2NdLnZpZGVvTW9kZWwmJihhPW5ldyBVKHdpbmRvdy5UVjJQbGF5ZXJzW2NdKSxhLml8fHRoaXMuYihhKXx8KHRoaXMuaShhKSxhLkEodGhpcy5hKSxhPW5ldyBiYShhLHRoaXMuYSksYS53KCkpKTt0aGlzLnUoKTt0aGlzLmcoKX07dmFyIGJkPW5ldyBJKFgpO1QuYShiZCk7eSh3LEEpO3cucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTt0aGlzLmIoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5nKGMpO3RoaXMuZigpfTt3LnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5U3RhdGUoKTthIT10aGlzLmwmJih0aGlzLmw9YSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMil9O3cucHJvdG90eXBlLmNhPQpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifTt3LnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX07dy5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX07eShyLEUpO3IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLnM9MDt0aGlzLlg9dGhpcy5YfHwhMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTt0aGlzLkcoKX07ci5wcm90b3R5cGUuRz1mdW5jdGlvbigpe2lmKCh0aGlzLmM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJnRoaXMuYy5hZHNMb2FkZXIpcmV0dXJuIHRoaXMuSWE9dGhpcy5jLmFkc0xvYWRlcix0aGlzLm8oKSwhMDt0aGlzLnMrKztpZih0aGlzLnM+dGhpcy5JKXRoaXMuSigibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz8KdGhpcy5mKCEwKTp0aGlzLmYoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkcuYmluZCh0aGlzKSwxMDApLCExfTtyLnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYTtpZihhKXt2YXIgYz0iYWRFcnJvciIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjIwKTooYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oZSl7dGhpcy5CKGUpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihlKXt0aGlzLkIoZSk7dGhpcy5KKCJhZGVycm9yIix0aGlzLlgpO3RoaXMuTigpfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmkoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwyMCl9O3IucHJvdG90eXBlLkI9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhmLGgpe3ZhciBtPSExO2lmKGYpe2lmKDEwMDk9PWZ8fDMwMz09Znx8NDAzPT1mKW09ITA7bXx8IWYuaW5kZXhPZnx8LTE9PT1mLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1mLmluZGV4T2YoIjMwMyIpJiYtMT09PWYuaW5kZXhPZigiNDAzIil8fChtPSEwKTsibnVtYmVyIj09dHlwZW9mIGYmJihoLlg9ZixoLkooImFkZXJyb3IiLGYpKX1yZXR1cm4gbX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYyhkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkQoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmMoYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkQoKTticmVha319O3IucHJvdG90eXBlLkQ9ZnVuY3Rpb24oKXt0aGlzLnU9ITB9O3IucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudT8odGhpcy5NKCksdGhpcy5iKCkpOnRoaXMuZighMCl9LmJpbmQodGhpcyksMTAwKX07ci5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXt0aGlzLmEodm9pZCAwPT09CmE/ITE6YSl9O3kocSxGKTtxLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE7aWYoKGE9ZXZhbCgidHJ5IHtzcmF2dnBsUGxheWVySW5zdGFuY2VzfWNhdGNoKGUpe2ZhbHNlfSIpKXx8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMmJndpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aCYmMDx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGgpZm9yKHZhciBjPWF8fHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLGQ9MDtkPGMubGVuZ3RoO2QrKylhPW5ldyB3KGNbZF0pLHRoaXMuYihhKXx8KHRoaXMuaShhKSwobmV3IHIoYSx0aGlzLmEpKS53KCkpO3RoaXMuZygpfTt2YXIgY2Q9bmV3IHEoWCk7VC5hKGNkKTt5KHQsQSk7dC5wcm90b3R5cGUuVD1mdW5jdGlvbigpe3ZhciBhPSExLGM9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGM9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYz8odGhpcy5iKGEpLAp0aGlzLmcoYyksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5hKCl9O3QucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9O3QucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9O3QucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn07eShRLEUpO1EucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLmMoKX07US5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoKHZvaWQgMD09PWE/MDphKT8odGhpcy5KKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuYSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYyghMCl9LmJpbmQodGhpcyksMTAwKSl9O3koSyxGKTtLLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTsKaWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyB0KHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmkpe3RoaXMuZygpO3JldHVybn1pZighdGhpcy5iKGEpKXt0aGlzLmkoYSk7KG5ldyBRKGEsdGhpcy5hKSkudygpO3RoaXMuZygpO3JldHVybn19dGhpcy5nKCl9O3ZhciBkZD1uZXcgSyhYKTtULmEoZGQpO3koRyxBKTtHLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5iKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuZyhhKTp0aGlzLmEoKSk6dGhpcy5hKCl9O0cucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9O0cucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfTsKRy5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iQVYifTt5KHgsRSk7eC5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcykpO3RoaXMuZigpO3RoaXMubygpfTt4LnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGM9MDtjPGEuYWRzTG9hZGVyLmxlbmd0aDtjKyspe3ZhciBkPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihkPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2NdLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihlKXtlLmdldEVycm9yJiYoZT1lLmdldEVycm9yKCkpO3ZhciBmPSExO2lmKDEwMDk9PWV8fDMwMz09ZXx8NDAzPT1lKWY9ITA7aWYoIWYpZm9yKHZhciBoIGluIGUpe2lmKGVbaF0mJmVbaF0uaW5kZXhPZiYmKC0xIT1lW2hdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWVbaF0uaW5kZXhPZigiMzAzIil8fC0xIT1lW2hdLmluZGV4T2YoIjQwMyIpKSl7Zj0hMDticmVha31pZihlW2hdJiYoMTAwOT09ZVtoXXx8MzAzPT1lW2hdfHw0MDM9PWVbaF0pKXtmPSEwO2JyZWFrfX1mPyh0aGlzLk0oKSx0aGlzLmIoKSk6dGhpcy5jKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5vLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9O3gucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtpZighdGhpcy5pKCkpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCksdGhpcy5NKCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5jKCk6dGhpcy5jKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfX07eC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxRTQpO3RoaXMuYShhKX07eShuLEYpO24ucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7YT1uZXcgRyhhKTthLmk/dGhpcy5nKCk6CnRoaXMuYihhKXx8KHRoaXMuaShhKSwobmV3IHgoYSx0aGlzLmEpKS53KCkpfTtuLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuYyh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuYyh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLmcoKX07dmFyIGVkPW5ldyBuKFgpO1QuYShlZCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihhKXtpZihhLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBjPWEuZmlsZW5hbWU/YS5maWxlbmFtZToiIjtpZigtMSE9Yy5pbmRleE9mKCJob21hZCIpfHwtMSE9Yy5pbmRleE9mKCJoZC1tYWluIikpYz1hLm1lc3NhZ2U/YS5tZXNzYWdlOiIiLGE9YS5lcnJvci5zdGFjaz8KYS5lcnJvci5zdGFjazoiIiwtMSE9Yy5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhhPWMuc3Vic3RyaW5nKGMuaW5kZXhPZigiOiIpKzEsYy5pbmRleE9mKCJpcyBub3QiKS0xKSxsLlAodi5ZKSxsLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixhLCEwKSk6LTEhPWEuaW5kZXhPZigic2V0QCIpJiYobC5QKHYuYWEpLGwudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgSWM9Zy5qLmwuZ2V0KCJzZXRJbnRlcnZhbCIpLEpjPWcuai5sLmdldCgic2V0VGltZW91dCIpO2cudj1uZXcgcWI7dHJ5e3ZhciBsYz1kb2N1bWVudC5jdXJyZW50U2NyaXB0fHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj0iaGQtbWFpbi5qcyJdJyk7bGMmJmxjLnNldEF0dHJpYnV0ZSgiaWQiLGcuai5sYigpKTt2YXIgeWM9bGMuZ2V0QXR0cmlidXRlKCJkYXRhLWluZm8iKTt5YyYmKGcudi5hPXdpbmRvd1t5Y10pfWNhdGNoKGEpe312YXIgTmI9bmV3IENhO2hiKCJjaGFubmVsTmFtZTogIisKTmIuYSgpLCJIb21hZEluaXQiKTtoYigiY2hhbm5lbE5hbWVEZXByZWNhdGVkOiAiK05iLmYoKSwiSG9tYWRJbml0Iik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoTmIuYSgpLGZ1bmN0aW9uKGEpe2cudi5nfHwoZy52LmE9YS5kZXRhaWwpfSwhMSk7bC5oYSh3aW5kb3csbC5nKDEwKSx7fSk7dmFyIHZjPWwuZygxMCk7dWMoKTtrLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7dGhpcy5vPSEwfTtrLnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5jPXRoaXMucGxheWVyLmNhKCk7Zy5wbGF5ZXI9YX07ay5wcm90b3R5cGUuRz1mdW5jdGlvbihhKXt0aGlzLmI9YX07ay5wcm90b3R5cGUuRj1mdW5jdGlvbihhKXt0aGlzLmc9YX07ay5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmdbYV07dGhpcy5nW3RoaXMuY10mJnRoaXMuZ1t0aGlzLmNdW2FdJiYoYz10aGlzLmdbdGhpcy5jXVthXSk7cmV0dXJuIGN9O2sucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSwKYyl7Yz12b2lkIDA9PT1jPyExOmM7Zy5VYS5nKCk7dmFyIGQ9ITE7aWYodGhpcy51KCkpdGhpcy5iLlJhKHRoaXMuYi5lYyx0aGlzLmIuQmEsdGhpcy5iLmRkLGZ1bmN0aW9uKCl7dGhpcy5pKGEsYyl9LmJpbmQodGhpcyksdGhpcy5iLnRiKTtlbHNlIGlmKGwudSYmLTE9PT13YS5QYS5pbmRleE9mKCJzdm1fZHJvcCIpJiYod2EuUGErPSImc3ZtX2Ryb3A9MSIpLHdhLmtiJiYhd2EuR2Qpd2EudGUoZnVuY3Rpb24oKXt0aGlzLmkoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2wuYSh2LmIsdGhpcy5wbGF5ZXIuQ2EoKSk7dmFyIGU9dGhpcy5nLGY9bmV3IGlhKHRoaXMucGxheWVyLGUpO2MmJmYuSSgpO2YuZXhpdEZ1bGxzY3JlZW4oKTt2YXIgaD1uZXcgdShmLHRoaXMuYixlKTtoLk5iKHRoaXMuZyk7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoZT0hMSx0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihlPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKSxhPQphKGUpKTthfHxsLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5yZSYmKGQ9ITEpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5lYShhLGQpO3RoaXMucGxheWVyLmpkKGgpfS5iaW5kKHRoaXMpLDApfX07ay5wcm90b3R5cGUudT1mdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlO2lmKHRoaXMuZil7dmFyIGM9YS5nZXRUaW1lKCktdGhpcy5mLmdldFRpbWUoKTt0aGlzLmY9YTtyZXR1cm4gM0U1PGM/ITA6ITF9dGhpcy5mPWE7cmV0dXJuITF9O2sucHJvdG90eXBlLks9ZnVuY3Rpb24oKXtsLnBhKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5hKCJhZFRhZyIpO3RoaXMuYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubShhKSk/dGhpcy5pKGEpOihsLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksCjApLGwuYSh2LmcsdGhpcy5wbGF5ZXIuQ2EoKSkpfTtrLnByb3RvdHlwZS5JPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLm8pe2wucGEoInBvc3Ryb2xsIik7dGhpcy5OKCk7dmFyIGM9dGhpcy5hKCJhZFRhZyIpO3RoaXMuYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5tKGMpKT90aGlzLmkoYyxnLnYuYigicG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50Iik/ITA6YSk6KGwudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGwuYSh2LmcsdGhpcy5wbGF5ZXIuQ2EoKSkpfX07ay5wcm90b3R5cGUubT1mdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX07ay5wcm90b3R5cGUuRD1mdW5jdGlvbigpe3RoaXMucGxheWVyLkhlKHRoaXMuSS5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuTWEoKX07ay5wcm90b3R5cGUucz1mdW5jdGlvbihhKXtsLnBhKCJtaWRyb2xsIik7aWYoIXRoaXMubCl7dGhpcy5sPSEwO3ZhciBjPXRoaXMuYSgiYWRUYWciKTt0aGlzLmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLmkoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubD0hMX0uYmluZCh0aGlzKSwxRTMpKToobC50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxsLmEodi5nLHRoaXMucGxheWVyLkNhKCkpKX19O2sucHJvdG90eXBlLkI9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5HZSh0aGlzLnMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuYmQoKX07ay5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMuSygpO3RoaXMucGxheWVyLmJkJiZ0aGlzLkIoKTt0aGlzLkQoKX19KSgpO30pKCk7Cg==
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
Tue, 12 Jan 2021 00:56:51 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 F3DE
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
05d72f6559d70bbd6928266327319d4d05e8e6f428ffd31d94cc9f3f10be4da2

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.3.damoh.tvtoday.de/d3dbec2a6c211f9e96833b47bc7f6219d4f34e7d/
112 B
680 B
XHR
General
Full URL
https://ssl.3.damoh.tvtoday.de/d3dbec2a6c211f9e96833b47bc7f6219d4f34e7d/
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.89.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.206.89.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
Tue, 12 Jan 2021 00:56:51 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
547f0c02e4b089153cb74c69_245.webp
images.tvtoday.de/itv/2021-01-12/
2 KB
2 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-12/547f0c02e4b089153cb74c69_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
5df648a74be4c4d28689aa4347ab28528d24ec024332c3e41a31c8fb334e74ae
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
Mon, 11 Jan 2021 23:05:03 GMT
last-modified
Thu, 07 Jan 2021 03:21:37 GMT
age
6707
etag
"860-5b846f0072f46"
vary
x-requested-with
x-varnish
511395129 511183275
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/webp
5fd3a6098189656084da6d05_245.webp
images.tvtoday.de/itv/2021-01-12/
8 KB
8 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-12/5fd3a6098189656084da6d05_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
f0a4a87655abcbee88914324236e390a9239082a79ff4dc2d71ae9809d7d7157
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
Mon, 11 Jan 2021 23:06:38 GMT
last-modified
Tue, 29 Dec 2020 10:21:48 GMT
age
6612
etag
"208a-5b797c21cf6d8"
vary
x-requested-with
x-varnish
499546157 502752357
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/webp
5fd359bb818965750e93ce6b_245.webp
images.tvtoday.de/itv/2021-01-11/
5 KB
5 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-11/5fd359bb818965750e93ce6b_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
b5e576dae44b8a458f77fd693fe5b5284cf5c9eb280604765dba03de018d632f
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
Tue, 12 Jan 2021 00:05:35 GMT
last-modified
Mon, 28 Dec 2020 10:55:20 GMT
age
3076
etag
"12e6-5b7841c32f51c"
vary
x-requested-with
x-varnish
499764795 497287069
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/webp
5fd3647c818965750e9432f8_245.webp
images.tvtoday.de/itv/2021-01-11/
6 KB
6 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-11/5fd3647c818965750e9432f8_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
5d9c88fe3c1806594b80db350862f1d1349bafa3afe9dcf4f0f9d8715a1ff545
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
Tue, 12 Jan 2021 00:05:35 GMT
last-modified
Mon, 28 Dec 2020 10:58:51 GMT
age
3076
etag
"1776-5b78428ce6f57"
vary
x-requested-with
x-varnish
499764802 511840310
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/webp
5fd35a34818965750e93d2f9_245.webp
images.tvtoday.de/itv/2021-01-11/
4 KB
4 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-11/5fd35a34818965750e93d2f9_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
1ce5dac3f151c74494f2b8e260968da2141e9915afb1d7e1d0d782c0e7fa313b
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
Tue, 12 Jan 2021 00:04:37 GMT
last-modified
Mon, 28 Dec 2020 10:53:21 GMT
age
3133
etag
"1064-5b78415199e9f"
vary
x-requested-with
x-varnish
504527823 505592360
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/webp
5fdc5aa481896512334958ba_245.webp
images.tvtoday.de/itv/2021-01-11/
6 KB
6 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-11/5fdc5aa481896512334958ba_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
36c3d9091a9f1861ef276afb6b4b8024ffb17537ae587e2db39512c2fb9b3e2b
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
Mon, 11 Jan 2021 23:11:56 GMT
last-modified
Mon, 28 Dec 2020 10:55:17 GMT
age
6295
etag
"1672-5b7841c0c856c"
vary
x-requested-with
x-varnish
503008310 510795364
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/webp
548a252de4b0c014706bce81_245.webp
images.tvtoday.de/itv/2021-01-11/
6 KB
6 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-11/548a252de4b0c014706bce81_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
81a8492a122dd35c039433702b938527feafd3e4e05b7318f4e510dc00f5bd72
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
Mon, 11 Jan 2021 23:11:44 GMT
last-modified
Mon, 28 Dec 2020 11:10:10 GMT
age
6306
etag
"18f4-5b784514a6fa0"
vary
x-requested-with
x-varnish
511395131 510603738
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/webp
5fd3a6098189656084da6d05_780.jpg
images.tvtoday.de/itv/2021-01-12/
46 KB
46 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-12/5fd3a6098189656084da6d05_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
577e17c75d5761607deb4eb144d884dccc42664278eb2fc4deeedfcb3d9db570
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
Tue, 12 Jan 2021 00:03:41 GMT
last-modified
Tue, 29 Dec 2020 10:21:48 GMT
age
3190
etag
"b64d-5b797c224364c"
vary
x-requested-with
x-varnish
507025628 506081393
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
5fd3a98e8189656084da86de_780.jpg
images.tvtoday.de/itv/2021-01-12/
51 KB
52 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-12/5fd3a98e8189656084da86de_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
4b0ded4e9e01b2821f529507364f2eaa1c34f15a959483f44d2605d6674335c9
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
Tue, 12 Jan 2021 00:07:04 GMT
last-modified
Tue, 29 Dec 2020 10:26:06 GMT
age
2987
etag
"cc0c-5b797d18a4a3d"
vary
x-requested-with
x-varnish
503008311 510701944
cache-control
public, max-age=1209600
strict-transport-security
max-age=15768000
accept-ranges
bytes
content-type
image/jpeg
5fd3add58189656084daac06_780.jpg
images.tvtoday.de/itv/2021-01-12/
41 KB
42 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2021-01-12/5fd3add58189656084daac06_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
c8722b17be623d053e2d0c5f61d6c1480d4c7609f94fb225c09830b23d99f4e8
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
Tue, 12 Jan 2021 00:17:55 GMT
last-modified
Tue, 29 Dec 2020 10:27:38 GMT
age
2336
etag
"a469-5b797d70454a9"
vary
x-requested-with
x-varnish
503008314 504749351
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| IDKHBdd function| UABPreloaded object| nvimjCln object| nvimjClne object| nvimjClni boolean| nvimjlsn object| nvimjf9eFlags string| nvimj6a6Rnd boolean| nvimjnpm boolean| videoScriptIsAlreadyExecuted function| UABPVreloaded object| nvimjd446tc 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 object| google_tag_data object| gaplugins object| gaGlobal object| gaData object| html5 object| Modernizr function| whenDefined object| _deqOptions object| google_tag_manager 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 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| nvimj47asdl boolean| nvimj47asdln string| nvimjd446genat string| nvimjd446sthash string| nvimjd446Domain boolean| nvimjb07forceimp object| nvimjsc 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 number| maxscrolled boolean| nvimj597Body boolean| nvimj33eDetect object| nvimj25aMobile object| nvimjd4461 object| nvimjd446o1 object| nvimjd446o2 object| nvimjd446o3 object| nvimjd4462 number| nvimjd446d3 object| nvimjd4464 object| nvimjd4465 boolean| nvimje54ij function| calculateDay function| homadAdTag object| exportz undefined| _ object| lazySizes undefined| Backbone object| jf function| videopkgInterface boolean| nvimj9e1Track string| hic_qos

4 Cookies

Domain/Path Name / Value
.tvtoday.de/ Name: _gat
Value: 1
.tvtoday.de/ Name: _gid
Value: GA1.2.1790450104.1610413010
.tvtoday.de/ Name: _ga
Value: GA1.2.1514907126.1610413010
.tvtoday.de/ Name: ioam2018
Value: 00138eb47253bf4865ffcf3d1:1638320209800:1610413009800:.tvtoday.de:2:tvspielf:D/T/R/H/W/-/-/Thema_Entertainment_tvtoday:noevent:1610413009800:oyo99r

10 Console Messages

Source Level URL
Text
console-api log URL: https://www.tvtoday.de/(Line 79)
Message:
mobileAlternate: https://m.tvtoday.de/
console-api log URL: https://www.tvtoday.de/(Line 467)
Message:
TftAdEngineBlocked:: false
console-api log URL: https://www.tvtoday.de/(Line 540)
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 4420)
Message:
AdBlockerNotDetected
console-api log URL: https://www.tvtoday.de/(Line 359)
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/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.3.damoh.tvtoday.de
stats.g.doubleclick.net
tvtoday.de
uobsoe.com
www.google-analytics.com
www.googletagmanager.com
www.tvtoday.de
13.224.94.116
136.243.25.11
143.204.93.40
148.251.89.206
151.106.72.75
2.16.186.73
2600:9000:2190:ac00:13:7ad6:7840:21
2a00:1450:4001:808::2008
2a00:1450:4001:808::200e
2a00:1450:4001:825::2006
2a00:1450:400c:c00::9b
2a02:26f0:6c00::210:bab2
2a02:26f0:6c00::210:bab8
2a02:26f0:6c00::210:bb28
52.217.10.246
65.9.7.35
78.46.33.212
91.215.100.39
91.215.103.65
00a35d8d7162283661105afcdda43eefc2beeb363d4b064f7ff137db60e5e14c
05d72f6559d70bbd6928266327319d4d05e8e6f428ffd31d94cc9f3f10be4da2
07effd27c24e20b1fc30659b8b771d95c785ab4d3dc3dedaccfcfbfd95b435e6
0ae5db3739ab7117213fc81312987373f78ea0b7006e644b2fa00b99ca04c0ad
103f77ffb505419ca5a6e4a8b74d9398f58ed76e484002911fd94e5796075bbb
17b83f6abf2bd24ee17266a0d2d17f44b5a328414e236d1a2bb6268440fb6d89
19d502b1c90d16b4132b9b01229277607cd18150518ec92a806c475a7426238b
1ce5dac3f151c74494f2b8e260968da2141e9915afb1d7e1d0d782c0e7fa313b
1d5b7c64458f4af91dcfee0354be47adde1f739b5aded03a7ab6068a1bb6ca97
22f138e2189f2659b3f920aaf4cb81963493984091199acf38dbb3db7be3235d
28645074de9b2587a42c2317b5876b375d933409b068567bb62d26e7316f6510
2a8a8d92be36ceebd55820a80c0d7618432572c506e503232ddf2f39249a26fa
2b4bc61ab37d7386d97ca8418168601c9f9e6f44fcddb47fe97ebf29bfdbc01b
2fcbe9ed682b16557f66e6fd4e7fa33b647eb54f921f4a3c37c526fb30ba45ab
30da2bff9b5cb0f94b04c9c21ec607dfb1b46cf706802a093185036b333f89e6
331b05ab63a9fc51ff711345c41007cd9e450ab4ba93d623d2455df04878e5b9
35539ddad96cfb13bb97b51fde24fbb89329480259928e0190d754a70bbe3ed9
36c3d9091a9f1861ef276afb6b4b8024ffb17537ae587e2db39512c2fb9b3e2b
396bd5624aa1984ef709feb67743e3a5557e1e9633ef9ddeae5d0a17fe803a85
3b7b8a4b411ddf8db9bacc2f3aabf406f8e4c0c087829b336ca331c40adfdff1
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
447b290e7282540ce73a197fc7583f6f3baad9e1b622e1febf215398e523b7bc
471b15c341415f023cd5387eb0bd4626883d010312f7b2a12f184613bda3f7df
4b0ded4e9e01b2821f529507364f2eaa1c34f15a959483f44d2605d6674335c9
4c19e27257577988274813ad04b681ae1cc446201a8e36dc20f8d3022fa92257
4dd67b29cc3e3eb840d0dce2c9088000e06b21134aabb021f2a2f98e5dc124b8
577e17c75d5761607deb4eb144d884dccc42664278eb2fc4deeedfcb3d9db570
5ad41f43166b293e1185b60b01a3a4247cfe8ac889b339df3de215f2f7934d8a
5d9c88fe3c1806594b80db350862f1d1349bafa3afe9dcf4f0f9d8715a1ff545
5df648a74be4c4d28689aa4347ab28528d24ec024332c3e41a31c8fb334e74ae
62214dab0c26ba36487bfa2d0498b0931ca9c8e20a2864b55ff509e3876d8692
6af654da3487974cabaad7ae8d273e5ee3b6e5adb8c1f8bc74b2a01b57bf16b0
6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
6d807e5aeaf5425dc80cd13a5e26190a4388a2f3592dbc78eaae149ff3448bd7
73acb88154558109a568cb65e76ae54cc7cd7e8e1174db5aca1bcc333659e2c5
75b5a9a9a007dc34d12f2cbe511e11f65859da6e0821ae76ca24340fa20ae058
7a2e7a80d7542d5e8ae0beeb3abd52a5f0346c99cca5ffa4c0f222699abfe64d
7a625d2dfdc959f77d95c2f8460330b62b1567d49c94e647bf84923ed18f3ddc
7d2f2875cdf32b9c50856aba00226b12b9b0c6a6af0862d734636b53a622375d
81a8492a122dd35c039433702b938527feafd3e4e05b7318f4e510dc00f5bd72
84e35c03e3a98c13a159b3d80c3d71d3cc9c625a7b25bf1d24138ae82caadbec
85cda4d55bcace5081124025c8f8a4d9ed4bebc5ef464e9aa880c84f7cb9783c
8d60669fddbf6b72a2e5fc8c13da74bbf90d1ea5da6676e058346414a14f2d55
9123226279b709b6da55233220826f2b547d859f2d3345a8692b463c6241ba95
921ecfdbc7b2b862099cb55dd98e60d5eb25213ab39de4b32f8d98f2e06286a0
9ce49a6036072f670176d60dfcd39ccfb8458af1f72af91cf028ef7d8c81570a
9d70d6b5316518c3a8856a3655156437e00baefd015180efabc83cd42302cced
9ee4550acb406ec171b67dcab98a2b4f184ba91831dad9ccf9551536029f71f0
a1d3db8192b827a383ef379c9098656bc3c1d8fc7f7a4f92dbfd6d53ccc98378
a44e9baa23235ac3254bee32824a709a3b7e32f95049234d7f69e682b9c664a6
ad502bba170342001e220db5b6cd7361091beb3535b02ff5537120689b0e9f72
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
aec60bc104db041b1512185839f18f52986df7e569e5445f740dd60f763fbca8
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277
b099ee6a5d30b54ef508de7ddfb2a78cd440ba624d27ed7d8b3f9a855f7d3de7
b5e576dae44b8a458f77fd693fe5b5284cf5c9eb280604765dba03de018d632f
be726dcabb9c264b1d1816ec0da60cb11fbb9b76afee12a82683d808a62a810c
bf6433080882816ede69d3317d486fa7fd2b63995f0e3bc7971465221e058c99
c8722b17be623d053e2d0c5f61d6c1480d4c7609f94fb225c09830b23d99f4e8
c89104ea547c4d58aeb92299465633b25ee3c1c9348c0e0b5ec471a34588c1c6
c90cff659645a312a28804965f3dbc34061338f7234ff5d6ddb2c57e9eadec15
d033f3bf9adb39b1aded5345a6731e4cf70ef85f0019b32464ebe55714c5a4cd
d4139cbcf4017cb369059548b41fe657c0d0c24284cd3192f073a0d65059fa69
d7414b3a412e2829b3c6a846fbf3038ee39bb472d77fba00a79632d41c2fea88
dd11699e5bc91d667cc55e032cf45a9e599f3cebc0e3f71e2539e97ca8703d1f
ddfa922e4f9fcd81cf6ab8c51707fe681cf1001ad918e793eabeea5d8b2c6967
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e441c3e2771625ba05630ab464275136a82c99650ee2145ca5aa9853bedeb01b
e83b8ec23b952200c3ba4729bfbac3b4379e66de48a31ca39c255fa7201ea65a
e886f98399d528aca71bfbe8e78396745d4c491ec04dd627d15a845b06d39cb4
e8aaebf9f69815ea93b6beff9b78806dacc9bcbf2a25eeee2297d5a95f1e2431
e8ba645d16c5d536f8972f469073ef79605040e36d933d1cca13e763b70f198e
ef30642a57b003936aaefedeee1b027e042e7404c26f089d3a6a56fcdf4dd8c8
f030078824011bb1050beac05088f511e35e2c149af10ee659e94ef1c5cd04b9
f0a4a87655abcbee88914324236e390a9239082a79ff4dc2d71ae9809d7d7157
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
feffa10be7222692f7cf76470564dbe7c0a3d76d5f4da8c12006b879f1cd21ec